【问题标题】:Anonymous inner classes and good practice [closed]匿名内部类和良好实践 [关闭]
【发布时间】:2016-03-05 16:56:48
【问题描述】:

我正在通过一些教程学习 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();
            }
        });
    }

}

在类中设置类被认为是一种好的做法吗?或者以某种方式在某个地方定义这个类然后引用它是否被认为更好?我该怎么做?

【问题讨论】:

  • @AndrewRegan 我知道它们是如何使用的——但我想知道它们是否被认为是好的做法。
  • android 文档并没有过多地暗示什么方法是“最好的”,但是如果你在布局中有几个按钮,你就不会为每个按钮创建匿名类。这变得很麻烦。而是考虑将 OnClickListener 实现为 Activity/Fragment 的一部分。
  • @Susheel 我该怎么做?我在上面发布了更多代码。如果我不想将监听器实现为内部类,那就是

标签: java android class android-studio standards


【解决方案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);

【讨论】:

    【解决方案2】:

    Inner Class 概念仅在没有现有 ObjcetClass)且没有范围存在另一个 ObjectClass)时出现。然后你可以在Class 中创建一个class

    这个概念是在Java v1.1 中引入的,当时AWT 在Java 中被引入以执行eventhandling。正如您在代码中使用的那样

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

    这里Click 事件如果且仅存在Clickable Object 存在(例如:- 按钮,或任何其他)。所以,EventListener 必须只与那些真正需要它的components 关联。这是有道理的……

    ==========替代方案=============

    您还可以将OnClickListener() 实现到任何其他自定义Event Handler 类。但这将是一项非常繁忙的任务,因为如果您使用 6(suppose) Clickable Componenets,那么您必须 write six 不同的 Class EventHandler 和将这个Class 传递给

                        new View.OnClickListener(new CustomEventHandler()) 
    

    希望你明白这个概念。还有很多后果,但你应该至少想一次。你可能会得到你的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多