2016-03-05 164 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()) 

希望你有概念..有太多的后果,但你应该至少考虑一次。你可能会得到你的答案。