我正在尝试在Home
活动中定义一个按钮来打开Settings
活动,但出现错误:
java.lang.RuntimeException:无法启动活动 ComponentInfo {com.example.padmw / com.example.padmw.Home}: java.lang.NullPointerException:尝试调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)' 在空对象引用上
“设置”项的布局位于res/menu
中,我尝试将其移至“ res/layout
”,但随后它说元素项不应存在。我该怎么办?
我在Home.class中的按钮:
Button mButton = (Button) findViewById(R.id.action_settings);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(Home.this, SettingsActivity.class));
}
});
我在res / home.xml中的项目:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never" />
</menu>
答案 0 :(得分:1)
如果要使用findViewById
,则按钮应位于布局中,而不是菜单中。
对于菜单,您需要覆盖onOptionsItemSelected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
// do something
return true;
default:
return super.onContextItemSelected(item);
}
}
并且您需要给home.xml菜单充气:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.home, menu);
return true;
}
请注意,您的home.xml应该位于res/menu/
文件夹中。
答案 1 :(得分:0)
因此对于菜单项,我们采用这种方式 1)要为活动指定选项菜单,请覆盖onCreateOptionsMenu()。通过这种方法,您可以增加菜单资源:-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
2)处理点击事件: 您可以将此ID与已知的菜单项进行匹配,以执行适当的操作。例如:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_settings:
// do your work
return true;
default:
return super.onOptionsItemSelected(item);
}
}