Android - 如何让按钮听不止一次

时间:2013-07-30 14:17:07

标签: java android button listeners

我有一个主屏幕和一堆buttons的应用,因此每个listeners。用户点击其中一个buttons后,系统会显示一个新的layout,而layout的{​​{1}}会带有back button

问题在于,每当用户按下listener时,主屏幕back button都会重新启动,但layout的任何一个都不再适用于listeners

以下是一些示例代码:

buttons

3 个答案:

答案 0 :(得分:2)

您不应使用setContentView()更改屏幕。在Android中更改屏幕,方法是使用startActivity(new Intent(...))启动一个新活动,或者使用像Malimo推荐的碎片(这样做有点困难但更好)。你打电话两次setContentView(),其中一人正在摧毁另一人。

答案 1 :(得分:1)

在我看来,你应该使用片段作为你的内容视图。因此每个片段都将负责其内容视图,并且每次显示时都可以添加监听器... http://developer.android.com/guide/components/fragments.html

答案 2 :(得分:0)

我确信Android中内置method允许您执行此操作,但我首先想到的是recursion

问题是你的听众使用的是onCreate方法,这意味着在他们运行之后,他们不会重复。在back button listener中, 当您再次将content view设置为主屏幕时,不会再次设置listeners,只会更改 content view

要解决此问题,您必须在点击onCreate后再次调用back button方法,因为这样会运行您的所有代码listeners 再次从主屏幕。

我建议将所有listeners放入listeners()方法,然后在需要时调用该方法recursively。它需要在onCreate(...)中调用, 以及点击back button时:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    listeners(); // set up all the listeners for the buttons    
}

public void listeners()
{
    setContentView(R.layout.main); // return to home screen
    // sets up a listener for when the GCF main screen button is clicked.
    GCFButton.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) 
        {
            setContentView(R.layout.gcf); // change to the gcf layout
            Button back = (Button)findViewById(R.id.btnBack); // set up the back button in the gcf layout
            back.setOnClickListener(new View.OnClickListener() // put a listener on back button
            {
                public void onClick(View v) 
                {
                    listeners(); // recursively call the listeners again to 'start over'
                }
            });

            Button GCFCalculate = (Button)findViewById(R.id.btnCalculate); // set up the gcf button in the gcf layout
            GCFCalculate.setOnClickListener (new View.OnClickListener() // put listener on gcf button in gcf layout
            {
                public void onClick(View v)
                {
                    // do stuff
            }
        });
    }
});

}

我还建议将back button listener放在自己的method中,以便每次layout更改时都可以调用它。