public class MainActivity extends AppCompatActivity {
private Button mBtn1,mBtn2,mBtn3,mBtn4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn1 = findViewById(R.id.btn_1);//最新版本的Android studio采用了泛化省去了类型转换
mBtn2 = findViewById(R.id.btn_2);
mBtn3 = findViewById(R.id.btn_3);
mBtn4 = findViewById(R.id.btn_4);
setListener();
}
private void setListener(){
OnClick onClick=new OnClick();
mBtn1.setOnClickListener(onClick);
mBtn2.setOnClickListener(onClick);
mBtn3.setOnClickListener(onClick);
mBtn4.setOnClickListener(onClick);
}
private class OnClick implements View.OnClickListener {
@Override
public void onClick(View view) {
Intent intent=null;
switch (view.getId()){//这个实例view哪里传过来的?
case R.id.btn_1:
intent=new Intent(MainActivity.this,MainActivityTest1.class);
break;
case R.id.btn_2:
intent=new Intent(MainActivity.this,MainActivityTest1.class);
break;
case R.id.btn_3:
intent=new Intent(MainActivity.this,MainActivityTest1.class);
break;
case R.id.btn_4:
intent=new Intent(MainActivity.this,MainActivityTest1.class);
break;
}
startActivity(intent);
}
}
我找到setOnClickListener()方法,发现其位于View类下,发现其就抛了个异常出来???。
public void setOnClickListener(@Nullable View.OnClickListener l) {
throw new RuntimeException("Stub!");
}
再看View.OnClickListener接口,其onClick(View var1)方法明显需要传一个View 类型的参数过来,问题是谁传过来的呢???
public interface OnClickListener {
void onClick(View var1);
}
参考网址:http://www.android-doc.com/reference/android/view/View.OnClickListener.html
虽然还是不知道怎么传过来的,不够总算知道view参数是谁,具体原理就不深挖了
https://blog.csdn.net/xubinjie517/article/details/82591867
看源码是怎么个流程吧
首先是这个点击事件
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
这个是View里面的点击事件的接口,也就是setOnClickListener需要的一个参数
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
理下流程你会发现在触摸事件后会走这个方法
public boolean performClick() {
// We still need to call this method to handle the cases where performClick() was called
// externally, instead of through performClickInternal()
notifyAutofillManagerOnClick();
final boolean result;
final ListenerInfo li = mListenerInfo;
if (li != null && li.mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this);
result = true;
} else {
result = false;
}
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
notifyEnterOrExitForAutoFillIfNeeded(true);
return result;
}
看到mOnClickListener.onClick(this);
这行,就是把当前的这个view返回到点击事件里了,也就是你当前单击的这个View。