2016-03-05 84 views
1

我學習的Android從幾個教程,並且當它涉及到使用OnClickListeners,我注意到,他們中的很多使用匿名內部類,像這樣:匿名內部類和好的做法

public class MainActivity extends AppCompatActivity { 

    private EditText mNameField; 
    private Button mStartButton; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mNameField = (EditText) findViewById(R.id.nameEditText); 
     mStartButton = (Button) findViewById(R.id.startButton); 

     mStartButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String name = mNameField.getText().toString(); 
       Toast.makeText(MainActivity.this, name, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

} 

這被認爲是班上有班級的好習慣?或者是以某種方式在某個地方定義這個類並認爲它更好?我將如何做到這一點?

+0

[如何在Java中使用匿名(內)班的可能的複製? ](http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java) –

+0

@AndrewRegan我知道他們是如何使用 - 但我問他們是否考慮去實踐。 – DoubleBass

+0

安卓文檔並沒有提示哪種方法是'最好的',但如果在佈局中有幾個按鈕,則不會爲每個按鈕創建匿名類。這變得很麻煩。請考慮將OnClickListener作爲活動/片段的一部分來實施。 – Susheel

回答

1

如果你必須重複一些代碼,你應該做一些重構,並只在一個地方定義它。如果在一個班級使用它。

public class MainActivity extends Activity { 
View.OnClickListener onClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //some code 
    } 
}; 

mStartButton.setOnClickListener(onClickListener); 

當您使用多個類

public class WidelyUsedOnClickListener implements View.OnClickListener { 
    @Override 
    public void onClick(View v) { 
    //some code 
    } 

} 然後同聽衆在活動

WidelyUsedOnClickLister onClickListener = new WidelyUsedOnClickLister(); 
mStartButton.setOnClickListener(onClickListener); 
0

Inner Class概念僅來到時,無需現有Objcet類)不存在範圍存在另一個Object)。那麼你可以在Class內創建一個class

此概念出現在Java v1.1AWT是在Java中引入執行eventhandling。正如你在你的代碼,如果使用

mStartButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

    } 
}); 

這裏Click事件,只存在Clickable Object存在(如: - 按鈕,或任何其它)。因此,EventListener必須僅與那些實際需要它的那些components相關聯。這是有道理的......

==========替代=============

您也可以實現OnClickListener()任何其他自定義Event Handler類。但是這將是一個非常繁忙的任務,這樣做,因爲如果你使用6假設)可點擊其它的組件,那麼你必須six不同Class EventHandler,並通過這個Class

    new View.OnClickListener(new CustomEventHandler()) 

希望你有概念..有太多的後果,但你應該至少考慮一次。你可能會得到你的答案。