Android 选项菜单没有改变
Android Optionsmenu does not change
所以我的问题是,我有一个片段。此片段用于创建新对象和编辑现有对象。
当我创建一个新对象时,我想要一个保存按钮。当我编辑一个对象时,我还想要一个删除按钮。
我有两个菜单布局文件。哪些是
R.menu.element_actionbar_edit
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_delete"
android:icon="@drawable/ic_action_delete"
android:title="@string/delete"
yourapp:showAsAction="always"/>
<item android:id="@+id/action_save"
android:icon="@drawable/ic_action_done"
android:title="@string/save"
yourapp:showAsAction="always"/>
</menu>
R.menu.element_actionbar_add
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_save"
android:icon="@drawable/ic_action_done"
android:title="@string/save"
yourapp:showAsAction="always"/>
</menu>
每当调用包含所有操作的片段时,它只会 onCreateOptionsMenu。
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.element_actionbar_add, menu);
super.onCreateOptionsMenu(menu, inflater);
}
尽管我调用了 R.menu.add 布局,它仍然向操作栏添加了两个项目,但在它实际膨胀之前,菜单已经包含两个项目。
这个片段是我现在唯一实际使用菜单的地方。
首先,我在创建选项中添加了一个 if 语句,以检查是否传递了要编辑的现有对象,但在这种情况下它确实显示了正确的布局,但是当没有传递任何内容时我应该只得到保存按钮?
为什么它显示错误的布局,甚至没有在其他任何地方指定它?
编辑:
所以成功了!
@Override
public void onPrepareOptionsMenu(Menu menu) {
if(currentObject==null) {
Global.ACTIVITY.getMenuInflater().inflate(R.menu.element_actionbar_add, menu);
}else{
Global.ACTIVITY.getMenuInflater().inflate(R.menu.element_actionbar_edit,menu);
}
super.onPrepareOptionsMenu(menu);
}
起初使用 onPrepare 设置菜单也没有用。我不得不从我的 phone 中完全删除该应用程序,然后重新安装它以使其正常工作。
If you want your menus to change dynamically you should not
use onCreateOptionMenu instead use onPrepareOptionMenus
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
if(save){
menu.add(0, ADD, 0, "Save");
}
else{
// add rest
}
return super.onPrepareOptionsMenu(menu);
}
每次单击菜单按钮时都会调用此方法,并且每次添加菜单时都必须调用 menu.clear()。
请在实施后分享您的结果。
所以我的问题是,我有一个片段。此片段用于创建新对象和编辑现有对象。
当我创建一个新对象时,我想要一个保存按钮。当我编辑一个对象时,我还想要一个删除按钮。
我有两个菜单布局文件。哪些是
R.menu.element_actionbar_edit
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_delete"
android:icon="@drawable/ic_action_delete"
android:title="@string/delete"
yourapp:showAsAction="always"/>
<item android:id="@+id/action_save"
android:icon="@drawable/ic_action_done"
android:title="@string/save"
yourapp:showAsAction="always"/>
</menu>
R.menu.element_actionbar_add
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_save"
android:icon="@drawable/ic_action_done"
android:title="@string/save"
yourapp:showAsAction="always"/>
</menu>
每当调用包含所有操作的片段时,它只会 onCreateOptionsMenu。
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.element_actionbar_add, menu);
super.onCreateOptionsMenu(menu, inflater);
}
尽管我调用了 R.menu.add 布局,它仍然向操作栏添加了两个项目,但在它实际膨胀之前,菜单已经包含两个项目。
这个片段是我现在唯一实际使用菜单的地方。
首先,我在创建选项中添加了一个 if 语句,以检查是否传递了要编辑的现有对象,但在这种情况下它确实显示了正确的布局,但是当没有传递任何内容时我应该只得到保存按钮?
为什么它显示错误的布局,甚至没有在其他任何地方指定它?
编辑: 所以成功了!
@Override
public void onPrepareOptionsMenu(Menu menu) {
if(currentObject==null) {
Global.ACTIVITY.getMenuInflater().inflate(R.menu.element_actionbar_add, menu);
}else{
Global.ACTIVITY.getMenuInflater().inflate(R.menu.element_actionbar_edit,menu);
}
super.onPrepareOptionsMenu(menu);
}
起初使用 onPrepare 设置菜单也没有用。我不得不从我的 phone 中完全删除该应用程序,然后重新安装它以使其正常工作。
If you want your menus to change dynamically you should not
use onCreateOptionMenu instead use onPrepareOptionMenus
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
if(save){
menu.add(0, ADD, 0, "Save");
}
else{
// add rest
}
return super.onPrepareOptionsMenu(menu);
}
每次单击菜单按钮时都会调用此方法,并且每次添加菜单时都必须调用 menu.clear()。 请在实施后分享您的结果。