Android-setOnClickListener vs OnClickListener vs View.OnClickListener

Android-setOnClickListener vs OnClickListener vs View.OnClickListener,android,onclicklistener,Android,Onclicklistener,我的理解是,当我创建侦听单击的按钮对象时,我必须: 创建按钮对象 使用OnClickListner使其能够听到用户的单击 在用户单击按钮后,使用onClick执行操作 现在, setOnClickListener在哪里适合上述逻辑 哪一个会真正听到按钮的点击 setOnClickListener OnClickListener View.OnClickListener 这三者之间有什么区别 以下是我在Android Dev中发现的内容: //The example below shows h

我的理解是,当我创建侦听单击的按钮对象时,我必须:

  • 创建按钮对象
  • 使用
    OnClickListner
    使其能够听到用户的单击
  • 在用户单击按钮后,使用
    onClick
    执行操作
  • 现在,

    • setOnClickListener
      在哪里适合上述逻辑
    • 哪一个会真正听到按钮的点击
    • setOnClickListener
    • OnClickListener
    • View.OnClickListener
    • 这三者之间有什么区别
    以下是我在Android Dev中发现的内容:

    //The example below shows how to register an on-click listener for a Button.
    
    // Create an anonymous implementation of OnClickListener
    private OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
          // do something when the button is clicked
        }
    };
    
    protected void onCreate(Bundle savedValues) {
        ...
        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        ...
    }
    
    您还可能会发现,作为
    活动的一部分实施
    OnClickListener
    更方便。这将避免额外的类负载和对象分配。例如:

    public class ExampleActivity extends Activity implements OnClickListener {
        protected void onCreate(Bundle savedValues) {
            ...
             Button button = (Button)findViewById(R.id.corky);
             button.setOnClickListener(this);
        }
    
        // Implement the OnClickListener callback
        public void onClick(View v) {
          // do something when the button is clicked
        }
    }
    

    逻辑很简单
    setOnClickListener
    属于步骤2

  • 您可以创建按钮
  • 您可以像在该示例中一样创建
    onClick-listener
    *的实例,并重写
    onClick
    -方法
  • 使用
    btn.setOnClickListener(myOnClickListener)将该
    OnClickListener
    分配给该按钮在片段/活动中
    onCreate
    -method
  • 当用户单击该按钮时,将调用分配的
    OnClickListener
    onClick
    函数
  • *如果您
    导入android.view.view
    您可以使用
    View.OnClickListener
    。如果您
    导入android.view.view.*
    导入android.view.view.OnClickListener您使用
    OnClickListener

    另一种方法是让您的活动/片段继承自
    OnClickListener
    。通过这种方式,您可以将片段/活动指定为按钮的侦听器,并将
    onClick
    实现为成员函数

  • 首先,
    View.OnClickListener
    OnClickListener
    之间没有区别。如果直接使用
    View.OnClickListener
    ,则无需编写-

    导入android.view.view.OnClickListener

  • 通过
    setOnclickListener()
    将OnClickListener实例(例如
    myListener
    命名对象)设置为视图的侦听器。当触发
    单击
    事件时,会通知
    myListener
    ,并调用它的
    onClick(View-View)
    方法。这是我们完成自己任务的地方。 希望这对你有帮助


  • 例如,假设我们有3个按钮

    public class MainActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
            // Capture our button from layout
            Button button = (Button)findViewById(R.id.corky);
            Button button2 = (Button)findViewById(R.id.corky2);
            Button button3 = (Button)findViewById(R.id.corky3);
            // Register the onClick listener with the implementation above
            button.setOnClickListener(mCorkyListener);
            button2.setOnClickListener(mCorkyListener);
            button3.setOnClickListener(mCorkyListener);
    
        }
    
        // Create an anonymous implementation of OnClickListener
        private View.OnClickListener mCorkyListener = new View.OnClickListener() {
            public void onClick(View v) {
                // do something when the button is clicked 
                // Yes we will handle click here but which button clicked??? We don't know
    
            }
        };
    
    }
    
    那我们该怎么办

    public class MainActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
            // Capture our button from layout
            Button button = (Button)findViewById(R.id.corky);
            Button button2 = (Button)findViewById(R.id.corky2);
            Button button3 = (Button)findViewById(R.id.corky3);
            // Register the onClick listener with the implementation above
            button.setOnClickListener(mCorkyListener);
            button2.setOnClickListener(mCorkyListener);
            button3.setOnClickListener(mCorkyListener);
    
        }
    
        // Create an anonymous implementation of OnClickListener
        private View.OnClickListener mCorkyListener = new View.OnClickListener() {
            public void onClick(View v) {
                // do something when the button is clicked
                // Yes we will handle click here but which button clicked??? We don't know
    
                // So we will make
                switch (v.getId() /*to get clicked view id**/) {
                    case R.id.corky:
    
                        // do something when the corky is clicked
    
                        break;
                    case R.id.corky2:
    
                        // do something when the corky2 is clicked
    
                        break;
                    case R.id.corky3:
    
                        // do something when the corky3 is clicked
    
                        break;
                    default:
                        break;
                }
            }
        };
    
    }
    
    或者我们可以这样做:

    public class MainActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
            // Capture our button from layout
            Button button = (Button)findViewById(R.id.corky);
            Button button2 = (Button)findViewById(R.id.corky2);
            Button button3 = (Button)findViewById(R.id.corky3);
            // Register the onClick listener with the implementation above
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // do something when the corky is clicked
                }
            });
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // do something when the corky2 is clicked
                }
            });
            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // do something when the corky3 is clicked
                }
            });
    
        }
    
    }
    
    或者我们可以实现View.OnClickListener,我认为这是最好的方法:

    public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
            // Capture our button from layout
            Button button = (Button)findViewById(R.id.corky);
            Button button2 = (Button)findViewById(R.id.corky2);
            Button button3 = (Button)findViewById(R.id.corky3);
            // Register the onClick listener with the implementation above
            button.setOnClickListener(this);
            button2.setOnClickListener(this);
            button3.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View v) {
            // do something when the button is clicked
            // Yes we will handle click here but which button clicked??? We don't know
    
            // So we will make
            switch (v.getId() /*to get clicked view id**/) {
                case R.id.corky:
    
                    // do something when the corky is clicked
    
                    break;
                case R.id.corky2:
    
                    // do something when the corky2 is clicked
    
                    break;
                case R.id.corky3:
    
                    // do something when the corky3 is clicked
    
                    break;
                default:
                    break;
            }
        }
    }
    

    最后,这里没有什么真正的区别,只是“比另一个更好”

    视图是所有小部件的超类,OnClickListener接口属于这个类。所有小部件都继承了这一点。View.OnClickListener与OnClickListener相同。您必须重写此侦听器中的onClick(View)方法,以实现按钮所需的操作

    要让Android监听小部件的点击事件,您需要执行以下操作:

    widget.setOnClickListener(this); // If the containing class implements the interface
    // Or you can do the following to set it for each widget individually
    widget.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Do something here
        }
    });
    

    onClick()方法中传递的'View'参数只是让Android知道已单击视图。它可以是一个按钮、文本视图或其他东西。您可以为每个小部件设置OnClickListener,或者让包含所有这些小部件的类实现接口。在本例中,您将有一个公共onClick()方法,您所要做的就是检查传递给该方法的视图的id,然后将其与您想要的每个元素的id进行匹配,并对该元素执行操作。

    请注意,为了简单起见,我只参考了第一个代码段,即

    // Create an anonymous implementation of OnClickListener
    private OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
          // do something when the button is clicked
        }
    };
    
    protected void onCreate(Bundle savedValues) {
        ...
        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        ...
    }
    
    setOnClickListener(View.OnClickListener l)
    是视图类的公共方法。Button类扩展了View类,因此可以调用
    setOnClickListener(View.OnClickListener l)
    方法

    setOnClickListener注册一个回调,在单击视图(在您的示例中为按钮)时调用该回调。此答案应回答您的前两个问题:

    1。
    setOnClickListener
    在上述逻辑中的位置是什么?

    答:单击按钮时,它会注册回调。(下一段将详细解释)

    2。哪个人会真正听到按钮的点击?

    答:
    setOnClickListener
    方法是实际侦听按钮单击的方法

    当我说它注册要调用的回调时,我的意思是它将运行
    View.OnClickListener l
    ,这是该方法的输入参数。在您的情况下,它将是
    button.setOnClickListener(mCorkyListener)中提到的
    mCorkyListener
    然后将执行中提到的方法
    onClick(视图v)

    // Create an anonymous implementation of OnClickListener
    private OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
          // do something when the button is clicked
        }
    };
    
    进一步说,
    OnClickListener
    是一个接口定义,用于在单击视图(本例中的按钮)时调用回调。简单地说,当您单击该按钮时,将执行
    mCorkyListener
    中的方法(因为它是
    OnClickListener
    的实现)。但是,
    OnClickListener
    只有一种方法,那就是
    OnClick(视图v)
    。因此,单击按钮时需要执行的任何操作都必须在此方法中进行编码

    既然您知道了
    setOnClickListener
    OnClickListener
    的意思,我相信您自己就能区分这两个词。第三个术语
    View.OnClickListener
    实际上是
    OnClickListener
    本身。前面有
    视图。
    的唯一原因是因为