这个问题困扰我差不多四个小时,就是因为我很习惯性地在Activity中使用findViewById方法实例化对象导致调用onOptionsItemSelected方法时候一直产生空指针异java.lang.NullPointerException: Attempt to invoke interface method 'int android.view.MenuItem.getItemId()' on a null object reference,当我点击选项菜单中的选项时候App运行直接闪退;
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
return super.onOptionsItemSelected(item);
}
原来的代码如下
public class Menu_definedByXml extends AppCompatActivity {
private TextView tex_word;
private TextView tv_menu;
private MenuItem menu_first;
private MenuItem menu_second;
private MenuItem menu_third;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.menu_defined_by_xml);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
tex_word = findViewById(R.id.test_word);
menu_first = findViewById(R.id.menu_first);
menu_second =findViewById(R.id.menu_second);
menu_third = findViewById(R.id.menu_third);
}
/**
* 创建选择菜单
* @param menu The options menu in which you place your items.
*
* @return true
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.main,menu);
return super.onCreateOptionsMenu(menu);
}
/**
* 绑定自定义菜单选择事件
* @param item The menu item that was selected.
*
* @return ture
*/
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if (itemId==menu_first.getItemId()){
Toast.makeText(this,"设置字体大小",Toast.LENGTH_SHORT).show();
}
if (itemId==menu_second.getItemId()){
Toast.makeText(this,"选择了菜单选项",Toast.LENGTH_SHORT).show();
}
if (itemId==menu_third.getItemId()){
Toast.makeText(this,"设置字体颜色",Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}
我将在Activity使用findViewById()方法实例化的对象删除并且修改了onOptionsItemSelected()方法中的条件就可以正常运行了
最后的代码如下:
public class Menu_definedByXml extends AppCompatActivity {
private TextView tex_word;
private TextView tv_menu;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.menu_defined_by_xml);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
tex_word = findViewById(R.id.test_word);
}
/**
* 创建选择菜单
* @param menu The options menu in which you place your items.
*
* @return true
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.main,menu);
return super.onCreateOptionsMenu(menu);
}
/**
* 绑定自定义菜单选择事件
* @param item The menu item that was selected.
*
* @return ture
*/
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if (itemId==R.id.menu_first){
Toast.makeText(this,"设置字体大小",Toast.LENGTH_SHORT).show();
}
if (itemId==R.id.menu_second){
Toast.makeText(this,"选择了菜单选项",Toast.LENGTH_SHORT).show();
}
if (itemId==R.id.menu_third){
Toast.makeText(this,"设置字体颜色",Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}
之后运行就正常了