在哪里设置所有的监听器?(涉及IT技术)

14

在哪里为用户界面设置所有的监听器
onCreate中设置它们是否是一个好的做法?这看起来很不结构化和奇怪。
是否有更好的地方可以设置它们?


1
如果你想让最终用户点击一个按钮并执行一个操作,最好在onCreate中初始化它们,然后可以在onClick(View v)中实现其余部分。 - Atieh
您可以使用我在答案中发布的建设性替代方案。 - Manmohan Badaya
6个回答

15

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

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

当您初始化视图时,它们已经准备好被监听了。onCreate 是设置监听器的好回调。或者您也可以在 onStartonResume 中设置它,但您应该理解这是一种不好的做法,因为每次用户看到您的活动时,onStartonResume 都会被调用。 onCreate 仅在 Activity 初始化时调用,这就是为什么您应该使用 onCreate 的原因。实际上,很好的做法是实现类似于 initListeners() 的方法,您可以在其中放置所有监听器逻辑。

祝你好运!


2
不好的答案。你应该总是在 onStart/onResume 中注册监听器,在 onStop/onPause 中注销它们。这是因为 onResume/onPause 在活动的生命周期中始终保证被调用,但其他方法则不一定。大多数人都会在 onStart/onStop 中执行此操作,因为这样可以减少多次注册和注销,并且通常会被调用,除非出现崩溃或操作系统杀死应用程序。 - Sourabh
问题是“在哪里为用户界面设置所有的监听器?”为什么需要注销它们?当活动停止时,您无法操作UI。人们从不注销UI监听器,如onClickListener和其他类似的监听器。 - Ilya Demidov

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方法中创建的部件。


1

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

考虑两个活动 A, B.

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

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


0

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

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”等。当有更多视图时,使用这种方式会变得难以阅读。 - nhaarman

0

你可以在xml中为任何视图设置onClick属性。现在你无需在onCreate中查找和设置onClick。现在你需要在活动中定义一个名称与xml中指定的相同的公共方法。这看起来构造得很好。


0

如在“Activity 生命周期”中所述,onCreate() 是执行仅需在活动的整个生命周期内发生一次的基本应用程序启动逻辑的地方。onStart() 是活动对用户可见的地方,而onResume() 是用户与活动交互的地方,比如触摸或单击。 因此,最好将点击监听器放在 onResume() 中。

参考:https://developer.android.com/guide/components/activities/activity-lifecycle#lc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接