2012-12-25 56 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. 幾行內容,沒有什麼特別的:做內聯,閱讀你代碼的人不需要去尋找一小段代碼。