1

我正在设置一个点击监听器,我想知道这是否可行?我看到很多人将 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

4 回答 4

3

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

于 2012-12-25T17:57:33.720 回答
0

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

login.setOnClickListener(this);

进而

extends Activity implements OnClickListener

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

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

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

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

添加这个:

-keepclassmembers 类 * 扩展 android.app.Activity { public void *(android.view.View); }

于 2012-12-25T18:04:27.683 回答
0

有多种方法可以onClickListner在视图上实现。您使用的也是正确的,不会对您造成任何问题。我个人更喜欢的是让 ClassOnClickListener interface在覆盖 onClick 方法中实现和使用 switch case 场景。

例如

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

    }
于 2012-12-25T18:09:26.497 回答
0

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

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

  2. 真正复杂的逻辑遵循点击:让内部/外部类实现该侦听器。

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

于 2012-12-25T18:16:53.913 回答