View.OnClickListener接口中onClick(View view)方法参数问题?

public void onClick(View view)中的view参数是怎么传过来的???

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。