设置onClickListener

时间:2012-12-25 17:56:13

标签: android onclicklistener

我正在设置一个点击监听器,我想知道这是否可以做到这一点?我看到很多人将onClickListener定义为与setOnClickListener一致,但这看起来非常混乱,所以我想知道我是否会遇到任何问题,这样做会不会发生这种情况?

public class Login extends Activity {

protected Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    login = (Button) findViewById(R.id.loginButton);
    login.setOnClickListener(myOnClick());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_login, menu);
    return true;
}

protected OnClickListener myOnClick() {
    OnClickListener v = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //Do stuff
        }
    };

    return v;
}

}

4 个答案:

答案 0 :(得分:3)

您如何定义它是您个人编码风格的选择。您可以让整个类实现接口,内联,按照您的方式执行,或指定要通过XML调用的方法。最终结果或多或少相同。

答案 1 :(得分:0)

如果您希望将所有onclicklistener方法保留在一个方法中,则可以实现该方法。为此你做

  

login.setOnClickListener(本);

然后

extends Activity implements OnClickListener

最后,您将添加未实现的方法。这会将所有按钮单击传递给onclick方法,您可以使用if / else或switch / case分配任何方法。

或者,您也可以使用XML定义它或使用您描述的方法。

然而,要了解优点和缺点:在xml中定义onClick可能会导致proguard出现问题。就个人而言,我觉得最简单的是在onclicklistener中使用一个开关和case,但是如果这个方法要长得多,那么给它自己的方法很好,以便“隐藏”它。但是,如果您需要在按下任何按钮后运行公共代码(例如UI刷新),最好将其留给交换机和案例或if / else

//只为想要在xml和proguard中使用OnClick的人添加

添加:

-keepclassmembers class * extends android.app.Activity {    public void *(android.view.View);  }

答案 2 :(得分:0)

在视图上实现onClickListner有多种方法。您使用的内容也是正确的,不会给您带来任何问题。我个人更喜欢让类实现OnClickListener interface并在覆盖onClick方法中使用switch case scenario。

e.g。

public class LoginExampleImplements extends Activity implements OnClickListener { 


    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 

    ...         

        btn1 = (Button)findViewById(R.id.btn1);
        btn2 = (Button)findViewById(R.id.btn2);

// Set Click Listener 


        btn1.setOnClickListener(this); 
        btn2.setOnClickListener(this); 
    } 

    @Override
    public void onClick(View v) { 

        switch(v.getId()){
           case R.id.btn1:
             // do stuff related btn1 click
             break;
           case R.id.btn2:
             // do stuff related btn2 click
             break;
         }

    }

答案 3 :(得分:0)

取决于您的代码风格,仍然是:

  1. 想要对很多按钮使用相同的方法:让类实现监听器接口,并使用视图id上的开关来找出点击的按钮。

  2. 点击后非常复杂的逻辑:让内部/外部类实现该侦听器。

  3. 几行,没什么特别的:做内联,阅读代码的人不需要去寻找一小段代码。