【问题标题】:Where to set all Listeners?在哪里设置所有监听器?
【发布时间】:2014-01-18 12:36:50
【问题描述】:

在哪里为用户界面设置所有Listeners
将它们设置在onCreate 中是一种好习惯吗?这看起来如此非结构化和奇怪。
有没有更好的地方来设置它们?

【问题讨论】:

  • 如果你想让最终用户点击一个按钮并做一个动作,你最好初始化它们onCreate,其余的可以在onClick(View v)中实现
  • 您可以使用我在答案中发布的建设性替代方案。

标签: android listener oncreate


【解决方案1】:

从这里:http://developer.android.com/reference/android/app/Activity.html

onCreate(Bundle) 是您初始化活动的地方。最多 重要的是,在这里你通常会调用 setContentView(int) 定义您的 UI 的布局资源,并使用 findViewById(int) 来 在该 UI 中检索您需要与之交互的小部件 以编程方式。

当您初始化视图时,它们就可以被监听了。 onCreate 是设置监听器的好回调。以其他方式,您可以将其设置为onStartonResume,但您应该理解,这是不好的做法,因为onStartonResume 每次都会在用户看到您的活动时调用。 onCreate 仅在 Activity 初始化时调用。这就是为什么你应该使用onCreate 的原因。实际上,好的做法是实现像 initListeners() 这样的方法,您可以在其中放置所有侦听器逻辑。

祝你好运!

【讨论】:

  • 错误答案。您应该始终在 onStart/onResume 中注册监听器并分别在 onStop/onPause 中取消注册它们。那是因为 onResume/onPause 保证在活动的生命周期中总是被调用,但休息不是。大多数人在 onStart/onStop 上执行此操作,因为它减少了多个注册和取消注册,并且大部分被调用,除非发生崩溃或操作系统杀死应用程序
  • 问题是“在哪里为用户界面设置所有侦听器?”。为什么需要注销它们?当 Activity 停止时,您无法使用 UI。人们永远不会取消注册像 onClickListener 和其他类似的 UI 列表器。
【解决方案2】:

使用onCreate方法设置UI并从UI获取Widget

protected void onCreate(Bundle savedValues) {
    // Here set the UI and get the widgets
    //set the Listeners on the widgets you are getting at the above line
}

您可以为小部件定义一个clickListener 并在onCreate 方法中使用它

OnClickListener someListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Toast.makeText(v.getContext(), "widget pressed ", Toast.LENGTH_SHORT).show();

    }
};

您可以将上面的clickListener 设置为您在onCreate 方法中创建的小部件

【讨论】:

    【解决方案3】:

    对于听众来说 onCreate() 是个好地方。

    考虑 2 个活动 A、B。

    A -> B,从 'A' 启动 'B' Activity,如果我们从 B -> A 返回,则 onStart(), onResume() 方法将在 'A' 活动中再次调用,这是多余的。所以最好只在 onCreate() 中添加监听器。

    而且,对于按钮监听器,您只能在 xml 文件中设置属性 android:onClick="method_name"。

    【讨论】:

      【解决方案4】:

      这可能是你想要避免的混乱

      public class SomeActivity extends Activity{
          @Override
          protected void onCreate(Bundle savedInstanceState){
              Button button1 = (Button)findViewById(R.id.button1);
              button1.setOnClickListener(new OnClickListener(){
                  @Override
                  public void onClick(View view){
                      SomeActivity.this.button1_onClick(view);
                  }
              });
          }
      
          private void button1_onClick(View view){
              ///do stubs here
          }
      }
      

      【讨论】:

      • 有很多方法可以避免这种混乱。使用内部类,让你的Activity 实现OnClickListener 等。当视图更多时,使用这种方式会变得不可读。
      【解决方案5】:

      您可以在 xml 中为任何视图设置 onClick 属性。所以现在您无需在 onCreate 中查找和设置 onClick。现在您需要在 xml 中提到的名称的活动中定义公共方法。这看起来是构建的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 2015-09-02
        • 1970-01-01
        相关资源
        最近更新 更多