Java 我应该在哪里声明不同布局的按钮?

Java 我应该在哪里声明不同布局的按钮?,java,android,button,layout,Java,Android,Button,Layout,我已经制作了一个计算器应用程序,我正在尝试创建一个关于页面来显示一些信息。 OK按钮将被编码为setContentView(originallayout.xml)以返回计算器布局 我应该把这些代码放在哪里来声明OK按钮 专用按钮btnOK btnOK=(按钮)findviewbyd(R.id.btnOK) btnok.setOnClickListener(OKListener) 我试着把这些代码放在主布局按钮的下方,但应用程序在启动后就停止了 07-18 09:39:43.290:E/Andro

我已经制作了一个计算器应用程序,我正在尝试创建一个关于页面来显示一些信息。 OK按钮将被编码为setContentView(originallayout.xml)以返回计算器布局

我应该把这些代码放在哪里来声明OK按钮

专用按钮btnOK

btnOK=(按钮)findviewbyd(R.id.btnOK)

btnok.setOnClickListener(OKListener)

我试着把这些代码放在主布局按钮的下方,但应用程序在启动后就停止了

07-18 09:39:43.290:E/AndroidRuntime(6984):java.lang.RuntimeException:无法启动活动组件信息{com.hychentsa.calculator/com.hychentsa.calculator.CalculatorActivity}:java.lang.NullPointerException

如果您的版面没有包含按钮的id(在您的例子中是
btnOK
),Eclipse将抛出NullPointerException-它无法在版面的内容中找到它。 因此,当您设置布局(或菜单)时,它必须包含id btnOK。检查一下

在设置内容视图(R.layout.your\u about\u layout\u name)之后放置按钮初始化 把这些代码放进去

Button btnOK;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);

btnOK = (Button)findViewById(R.id.btnOK);
btnok.setOnClickListener(OKListener);
}
更新: 看看invertigo的答案: 单击按钮时更改布局是错误的。 你必须这样做:

计算器活动

public class CalculatorActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calculator_black);

// initialization of your views stays here
}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calculator_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.your_id_to_go_in_about_activity:
                Intent intent = new Intent(CalculatorActivity.this, AboutActivity.class);

                // put some extras if you need to send information from this page to the
                // AboutActivity page with this code: intent.putExtra();
                startActivity(intent); // with this code you go to AboutActivity
                return true;
            case R.id.theme:
                // Do Something with the theme
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
现在,OKButton的初始化位置在新类中,让我们调用它 关于触觉 您可以在此处输入我以前的代码:

public class AboutActivity extends Activity{

Button btnOK;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);

btnOK = (Button)findViewById(R.id.btnOK);
btnok.setOnClickListener(OKListener);
}

 // and the listener for your OK button have to look like this:
OnClickListener OKListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Do something here if you need
            finish(); // with finish() you are returning to the previous page
            // which is CalculatorActivity
        }
    };
}

如果您的版面没有包含按钮的id(在您的例子中是btnOK),Eclipse将抛出NullPointerException-它无法在版面的内容中找到它。 因此,当您设置布局(或菜单)时,它必须包含id btnOK。检查一下

在设置内容视图(R.layout.your\u about\u layout\u name)之后放置按钮初始化 把这些代码放进去

Button btnOK;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);

btnOK = (Button)findViewById(R.id.btnOK);
btnok.setOnClickListener(OKListener);
}
更新: 看看invertigo的答案: 单击按钮时更改布局是错误的。 你必须这样做:

计算器活动

public class CalculatorActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calculator_black);

// initialization of your views stays here
}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calculator_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.your_id_to_go_in_about_activity:
                Intent intent = new Intent(CalculatorActivity.this, AboutActivity.class);

                // put some extras if you need to send information from this page to the
                // AboutActivity page with this code: intent.putExtra();
                startActivity(intent); // with this code you go to AboutActivity
                return true;
            case R.id.theme:
                // Do Something with the theme
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
现在,OKButton的初始化位置在新类中,让我们调用它 关于触觉 您可以在此处输入我以前的代码:

public class AboutActivity extends Activity{

Button btnOK;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);

btnOK = (Button)findViewById(R.id.btnOK);
btnok.setOnClickListener(OKListener);
}

 // and the listener for your OK button have to look like this:
OnClickListener OKListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Do something here if you need
            finish(); // with finish() you are returning to the previous page
            // which is CalculatorActivity
        }
    };
}

与使用setContentView()更改屏幕不同,您应该有单独的活动。然后,在about活动中,只需单击按钮调用finish(),即可返回到主活动


您应该有单独的活动,而不是使用setContentView()来更改屏幕。然后,在about活动中,只需单击按钮调用finish(),即可返回到主活动


您正在从不同的视图层次结构初始化按钮?您可以
findViewById
将当前视图层次设置为“活动”。是否从其他视图层次初始化按钮?您可以
查找设置为活动的当前视图层次结构的
findViewById
。很抱歉,它不起作用。。。实际上,当我打开应用程序时,它会将布局设置为
R.layout.calculator_black
,当我单击菜单的“about”项后,它会将布局设置为
R.layout.about
,此布局包含一个按钮btnOK。我想设置此按钮,使其在单击时将布局设置回R.layout.calculator_black。在我完成更新后,您是否尝试了我的代码?应该行的,抱歉不行。。。实际上,当我打开应用程序时,它会将布局设置为
R.layout.calculator_black
,当我单击菜单的“about”项后,它会将布局设置为
R.layout.about
,此布局包含一个按钮btnOK。我想设置此按钮,使其在单击时将布局设置回R.layout.calculator_black。在我完成更新后,您是否尝试了我的代码?它应该会起作用。