Java 安卓-如何让按钮多听一次

Java 安卓-如何让按钮多听一次,java,android,button,listeners,Java,Android,Button,Listeners,我有一个应用程序,它有一个主屏幕和一堆按钮,因此每个按钮都有监听器。用户单击其中一个按钮后,会出现一个新的布局,该布局有一个带有侦听器的后退按钮 问题是,每当用户按下后退按钮时,主屏幕布局会被调回,但是侦听器不再为按钮工作 以下是一些示例代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.la

我有一个应用程序,它有一个主屏幕和一堆
按钮,因此每个按钮都有
监听器。用户单击其中一个
按钮后,会出现一个新的
布局
,该
布局
有一个带有
侦听器的
后退按钮

问题是,每当用户按下
后退按钮时,主屏幕
布局
会被调回,但是
侦听器
不再为
按钮
工作

以下是一些示例代码:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    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) 
                {
                    setContentView(R.layout.main); // return to home screen
                }
            });

            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
                }
            });
        }
    });
}

我确信Android中内置了一个
方法
,可以让你做到这一点,但我的第一个想法是
递归

问题是您的侦听器处于
onCreate
方法中,这意味着在运行完它们之后,它们不会重复。在
后退按钮侦听器中
, 当您再次将
内容视图
设置为主屏幕时,不会再次设置
侦听器
,只会更改
内容视图

要解决这个问题,您必须在单击
back按钮
后再次调用
onCreate
方法,因为这样它将使用所有
侦听器运行整个代码
再次从主屏幕

我建议将所有
侦听器
放在
listeners()
方法中,然后在需要时递归调用该方法。需要在
onCreate(…)
中调用它, 以及单击
后退按钮时:

@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
            }
        });
    }
});
}


我还建议将
后退按钮侦听器
放在它自己的
方法中
,这样每次更改
布局
时都可以调用它。

在我看来,您应该为ContentView使用片段。因此,每个片段都将负责其contentview,并且可以在每次显示时添加侦听器。。。

您不应使用
setContentView()
更改屏幕。在安卓系统中,通过使用
startActivity(newintent(…)
或Malimo推荐的片段启动一个新活动(这有点困难,但更好)来改变屏幕。调用两次
setContentView()
,其中一个正在销毁另一个