Android - setOnClickListener vs OnClickListener vs View.OnClickListener

时间:2015-04-06 21:03:36

标签: android onclicklistener

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

  1. 创建按钮对象
  2. 使用OnClickListner使其听取用户点击
  3. 使用onClick在用户点击按钮后执行操作
  4. 现在,

    • 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作为Activity的一部分实施起来会更方便。这将避免额外的类加载和对象分配。例如:

    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
        }
    }
    

5 个答案:

答案 0 :(得分:53)

想象一下,我们有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;
        }
    }
}

最后这里没有真正的区别只是“比其他方式更好”

答案 1 :(得分:21)

逻辑很简单。 setOnClickListener属于第2步。

  1. 您创建按钮
  2. 您创建了OnClickListener *的实例,就像在该示例中完成的那样,并覆盖onClick - 方法。
  3. 您在片段/活动OnClickListener - 方法中使用btn.setOnClickListener(myOnClickListener);onCreate分配给该按钮。
  4. 当用户点击该按钮时,系统会调用已分配的onClick的{​​{1}}功能。
  5. *如果您OnClickListener使用import android.view.View;。如果您View.OnClickListenerimport android.view.View.*;,我就会使用import android.view.View.OnClickListener;

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

答案 2 :(得分:7)

请注意,为简单起见,我只提到了第一个代码片段,即

// 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)是View类的公共方法。 Button类扩展了View类,因此可以调用setOnClickListener(View.OnClickListener l)方法。

setOnClickListener注册一个回调,当单击视图(在您的情况下为按钮)时将调用该回调。这个答案应该回答你的前两个问题:

<强> 1。 setOnClickListener在哪里符合上述逻辑?

答。它在单击按钮时注册回调。 (在下一段中详细解释)。

<强> 2。哪一个实际上听了按钮点击?

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

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

中提到的方法onClick(View 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(View v)方法。因此,无论在单击按钮时需要执行的操作都必须在此方法中进行编码。

既然您知道setOnClickListenerOnClickListener的含义,我相信您自己能够区分这两者。第三项View.OnClickListener实际上是OnClickListener本身。你前面有View.的唯一原因是因为程序开头的import语句不同。如果您只有import android.view.View;作为导入语句,则必须使用View.OnClickListener。如果您提到以下任何一个import语句: import android.view.View.*;import android.view.View.OnClickListener;您可以跳过View.,只需使用OnClickListener

答案 3 :(得分:4)

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

要告诉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知道已经点击了一个视图。它可以是Button或TextView或其他东西。您可以为每个窗口小部件设置OnClickListener,或者只是让包含所有这些窗口小部件的类实现该接口。在这种情况下,您将为所有窗口小部件提供一个通用的onClick()方法,您所要做的就是检查传递给方法的视图的ID,然后将其与您想要的每个元素的id相匹配。对该元素采取行动。

答案 4 :(得分:3)

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

    import android.view.View.OnClickListener

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