Android - setOnClickListener vs OnClickListener vs View.OnClickListener

nin*_*oto 34 android onclicklistener

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

  1. 创建按钮对象
  2. 使用OnClickListner使它听取用户的点击
  3. 用于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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

您可能还会发现将其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
    }
}
Run Code Online (Sandbox Code Playgroud)

Ibr*_*uki 54

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

        }
    };

}
Run Code Online (Sandbox Code Playgroud)

那么我们会做什么?

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

}
Run Code Online (Sandbox Code Playgroud)

或者我们可以这样做:

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

    }

}
Run Code Online (Sandbox Code Playgroud)

或者我们可以实现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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 23

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

  1. 您创建按钮
  2. 您创建OnClickListener*的实例,就像在该示例中完成的那样,并覆盖onClick-method.
  3. OnClickListener可以btn.setOnClickListener(myOnClickListener);在fragment/activities onCreate-method中使用该按钮分配该按钮.
  4. 当用户单击该按钮时,将onClick调用已分配的功能OnClickListener.

*如果import android.view.View;你使用View.OnClickListener.如果你import android.view.View.*;import android.view.View.OnClickListener;你使用OnClickListener我得到它.

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


Rog*_*nna 8

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

// 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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

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
    }
};
Run Code Online (Sandbox Code Playgroud)

继续前进,OnClickListener是一个接口定义,用于在单击视图(在您的情况下为按钮)时调用回调.简单地说,当您单击该按钮时,将执行其中的方法mCorkyListener(因为它是一个实现OnClickListener).但是,OnClickListener只有一种方法OnClick(View v).因此,无论在单击按钮时需要执行的任何操作都必须在此方法中进行编码.

现在你知道了什么setOnClickListenerOnClickListener意思,我相信你自己能够区分这两者.第三个词View.OnClickListener实际上OnClickListener就是它自己.你View.之前唯一的原因是因为import程序开头的规则存在差异.如果您只有import android.view.View;import语句,则必须使用View.OnClickListener.如果你提到这些导入语句中的任何一个: import android.view.View.*;或者import android.view.View.OnClickListener;你可以跳过View.并简单地使用OnClickListener.


ucs*_*nil 6

View 是所有小部件的超类,OnClickListener 接口属于此类。所有小部件都继承了这一点。View.OnClickListener 与 OnClickListener 相同。您必须覆盖此侦听器中的 onClick(View 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
    }
});
Run Code Online (Sandbox Code Playgroud)

onClick() 方法中传递的“View”参数只是让 Android 知道某个视图已被单击。它可以是 Button 或 TextView 或其他东西。您可以为每个小部件设置一个 OnClickListener 或简单地使包含所有这些小部件的类实现该接口。在这种情况下,您将有一个用于所有小部件的通用 onClick() 方法,您所要做的就是检查传递给该方法的视图的 id,然后将其与您想要的每个元素的 id 进行匹配,对该元素采取行动。