onOptionsItemSelected 未调用
onOptionsItemSelected not called
我的操作栏中有一个菜单项列表。每个项目点击应该触发不同的方法。但是永远不会调用 onOptionsItemSelected。
这是在 MainActivity 中定义操作栏的方式:
public class MainActivity extends AppCompatActivity {
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings_1) {
//do something
return true;
} else if (id == R.id.action_settings_2) {
//do something
return true;
} else if (id == R.id.action_settings_1) {
//do something
return true;
}
return super.onOptionsItemSelected(item);
}
...
}
这是操作栏菜单布局menu_main:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.MainActivity">
<item
android:id="@+id/action_settings_1"
android:orderInCategory="1"
android:title="Item 1"
app:showAsAction="never" />
<item
android:id="@+id/action_settings_2"
android:orderInCategory="2"
android:title="Item 2"
app:showAsAction="never" />
<item
android:id="@+id/action_settings_3"
android:orderInCategory="3"
android:title="Item 3"
app:showAsAction="never" />
</menu>
如何设置操作栏以便在单击操作栏项目时调用 onOptionsItemSelected?
在您的 onCreateOptionsMenu
内部,return true 而不是调用 super。应该这样做
只需进行如下更改即可:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
在onCreate()中调用setSupportActionbar(),像这样
toolbar = (Toolbar)findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
如果在 XML 中使用 menu
属性,也可能会发生此问题:
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
app:menu="@menu/your_menu"
app:navigationIcon="@drawable/..."
app:title="@string/..." />
因此 app:menu="@menu/your_menu"
不适用于覆盖的片段方法 onOptionsItemSelected
。菜单项点击侦听器必须设置为 Toolbar
private fun setMenuClickListener(toolbar: MaterialToolbar) = with(toolbar) {
setOnMenuItemClickListener { menuItem ->
if (menuItem.itemId == R.id.yourId) {
//do something
return@setOnMenuItemClickListener true
}
//this is a lambda so it can be just false,
//added return to make it explicit
return@setOnMenuItemClickListener false
}
}
所以我们要找的是来自MaterialToolbar
的setOnMenuItemClickListener
试试这个:
而不是实施
@Override
public boolean onCreateOptionsMenu
...
在activity_main.xml中添加:
<androidx.appcompat.widget.Toolbar
android:id="@+id/myToolbar"
app:title="@string/myTitle"
app:menu="@menu/menu_main"
>
</androidx.appcompat.widget.Toolbar>
接下来,在menu_main.xml中添加每一项:
android:onClick="onOptionsItemSelected"
像这样:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.MainActivity">
<item
android:id="@+id/action_settings_1"
android:orderInCategory="1"
android:title="Item 1"
app:showAsAction="never"
android:onClick="onOptionsItemSelected" />
<item
android:id="@+id/action_settings_2"
android:orderInCategory="2"
android:title="Item 2"
app:showAsAction="never"
android:onClick="onOptionsItemSelected" />
<item
android:id="@+id/action_settings_3"
android:orderInCategory="3"
android:title="Item 3"
app:showAsAction="never"
android:onClick="onOptionsItemSelected" />
</menu>
我的操作栏中有一个菜单项列表。每个项目点击应该触发不同的方法。但是永远不会调用 onOptionsItemSelected。
这是在 MainActivity 中定义操作栏的方式:
public class MainActivity extends AppCompatActivity {
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings_1) {
//do something
return true;
} else if (id == R.id.action_settings_2) {
//do something
return true;
} else if (id == R.id.action_settings_1) {
//do something
return true;
}
return super.onOptionsItemSelected(item);
}
...
}
这是操作栏菜单布局menu_main:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.MainActivity">
<item
android:id="@+id/action_settings_1"
android:orderInCategory="1"
android:title="Item 1"
app:showAsAction="never" />
<item
android:id="@+id/action_settings_2"
android:orderInCategory="2"
android:title="Item 2"
app:showAsAction="never" />
<item
android:id="@+id/action_settings_3"
android:orderInCategory="3"
android:title="Item 3"
app:showAsAction="never" />
</menu>
如何设置操作栏以便在单击操作栏项目时调用 onOptionsItemSelected?
在您的 onCreateOptionsMenu
内部,return true 而不是调用 super。应该这样做
只需进行如下更改即可:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
在onCreate()中调用setSupportActionbar(),像这样
toolbar = (Toolbar)findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
如果在 XML 中使用 menu
属性,也可能会发生此问题:
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
app:menu="@menu/your_menu"
app:navigationIcon="@drawable/..."
app:title="@string/..." />
因此 app:menu="@menu/your_menu"
不适用于覆盖的片段方法 onOptionsItemSelected
。菜单项点击侦听器必须设置为 Toolbar
private fun setMenuClickListener(toolbar: MaterialToolbar) = with(toolbar) {
setOnMenuItemClickListener { menuItem ->
if (menuItem.itemId == R.id.yourId) {
//do something
return@setOnMenuItemClickListener true
}
//this is a lambda so it can be just false,
//added return to make it explicit
return@setOnMenuItemClickListener false
}
}
所以我们要找的是来自MaterialToolbar
setOnMenuItemClickListener
试试这个:
而不是实施
@Override
public boolean onCreateOptionsMenu
...
在activity_main.xml中添加:
<androidx.appcompat.widget.Toolbar
android:id="@+id/myToolbar"
app:title="@string/myTitle"
app:menu="@menu/menu_main"
>
</androidx.appcompat.widget.Toolbar>
接下来,在menu_main.xml中添加每一项:
android:onClick="onOptionsItemSelected"
像这样:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.MainActivity">
<item
android:id="@+id/action_settings_1"
android:orderInCategory="1"
android:title="Item 1"
app:showAsAction="never"
android:onClick="onOptionsItemSelected" />
<item
android:id="@+id/action_settings_2"
android:orderInCategory="2"
android:title="Item 2"
app:showAsAction="never"
android:onClick="onOptionsItemSelected" />
<item
android:id="@+id/action_settings_3"
android:orderInCategory="3"
android:title="Item 3"
app:showAsAction="never"
android:onClick="onOptionsItemSelected" />
</menu>