2012-12-25 57 views
1

我正在设置一个点击监听器,我想知道这是否是一个好方法吗?我看到很多人根据setOnClickListener定义了onClickListener,但是这看起来很混乱,所以我想知道是否会遇到任何问题,并且这样做会在路上走?设置onClickListener

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

} 

回答

3

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

0

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

login.setOnClickListener(this);

然后

extends Activity implements OnClickListener 

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

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

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

//只需要添加那些想要使用OnClick XML和ProGuard的内

补充一点:

-keepclassmembers类*宽android.app.Activity { 公共无效*(android.view.View); }

0

对视图实现onClickListner有多种方法。你用过的东西也是正确的,不会给你造成任何问题。我个人比较喜欢的是让Class实现OnClickListener interface并在override 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; 
     } 

    } 
0

取决于你的代码风格,依旧:

  1. 想用同样的方法进行了大量的按钮:让类实现侦听器接口,并使用一个开关上视图id找出哪些按钮点击。

  2. 真正复杂的逻辑如下点击:有一个内部/外部类实现侦听器。

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