通过可扩展标记语言,我可以向ActionBar
中的操作添加子菜单项。
main_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_new_form"
android:icon="@drawable/ic_new_form"
android:title="@string/menu_new_form"
android:showAsAction="ifRoom|withText">
<menu>
<item android:id="@+id/form1"
android:icon="@drawable/attachment"
android:title="Form 1"
android:onClick="onSort" />
<item android:id="@+id/form2"
android:icon="@drawable/attachment"
android:title="Form 2"
android:onClick="onSort" />
</menu>
</item>
</menu>
但是如何通过代码添加这些子项呢?它不像下面那样工作,子项被添加到错误的操作中(而且绘图文件也没有显示),是非常正确的按钮,而不是我的“新表单”按钮:
main_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_new_form"
android:icon="@drawable/ic_new_form"
android:title="@string/menu_new_form"
android:showAsAction="ifRoom|withText">
</item>
</menu>
Java代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Log.d("MainMenu", ",menu title0: " + menu.getItem(0).getTitle());
// returns "New Form"
menu.addSubMenu(0, Menu.NONE, 1, "Form 1").setIcon(R.drawable.attachment);
menu.addSubMenu(0, Menu.NONE, 2, "Form 2").setIcon(R.drawable.attachment);
return true;
}
有没有办法做到这一点,通过Java Code而不是XML添加子菜单项,使用PopupMenu
(http://developer.android.com/guide/topics/ui/menus.html#PopupMenu)在没有的情况下添加?
更新(解决方案):
我的最后一段代码,按照adamp的回答,动态地填充子菜单:
// menu options
private static final int MENU_PREFERENCES = Menu.FIRST;
private static final int MENU_LOGOUT = 2;
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
menu.add(0, MENU_PREFERENCES, 0, getString(R.string.general_preferences)).setIcon(
android.R.drawable.ic_menu_preferences);
// load all available form templates
Cursor c = managedQuery(FormsProviderAPI.FormsColumns.CONTENT_URI, null, null, null, null);
try {
int ixDisplayName = c.getColumnIndex(FormsProviderAPI.FormsColumns.DISPLAY_NAME);
int ixId = c.getColumnIndex(FormsProviderAPI.FormsColumns._ID);
int cnt = 0;
while (c.moveToNext()) {
cnt++;
Log.d("ID: ", "ID: "+ c.getInt(ixId)); // misusing the group id for the form id
menu.getItem(1).getSubMenu().addSubMenu(c.getInt(ixId), Menu.NONE, cnt, c.getString(ixDisplayName)).setIcon(R.drawable.attachment_dark);
}
} catch (Exception e) {
Log.e(TAG, "Error init form templates list.", e);
}
return true;
}
发布于 2012-02-19 06:18:51
发布于 2012-06-28 22:08:57
添加一个ActionProvider可能会更简单。您可以尝试使用解释过的here
发布于 2015-10-17 04:02:25
您应该考虑使用ActionProvider
示例:https://gist.github.com/sibelius/7ca0b757492ff6740dec
带有操作提供程序项的菜单
<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">
<item android:id="@+id/action_companies"
android:icon="@drawable/ic_list"
android:title="@string/action_companies"
app:actionProviderClass="com.example.MyActionProvider"
app:showAsAction="always"/>
</menu>
代码
public class MyActionProvider extends ActionProvider {
private Context mContext;
public MyActionProvider(Context context) {
super(context);
mContext = context;
}
@Override
public View onCreateActionView() {
//LayoutInflater layoutInflater = LayoutInflater.from(mContext);
return null;
}
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
super.onPrepareSubMenu(subMenu);
subMenu.clear();
subMenu.add("menu 1");
subMenu.add("menu 2");
subMenu.add("menu 3");
}
@Override
public boolean hasSubMenu() {
return true;
}
@Override
public boolean onPerformDefaultAction() {
return super.onPerformDefaultAction();
}
}
https://stackoverflow.com/questions/9344160
复制相似问题