Xmlを介して、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>
しかし、Java code)でこれらのサブアイテムを追加するにはどうすればよいですか?私の「新しいフォーム」ボタンではなく、非常に正しいボタンが間違ったアクションに追加されています(また、ドロアブルも表示されていません):
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 XMLの代わりにコード、withoutを介してサブメニュー項目を追加するPopupMenu
( http://developer.Android.com/guide/topics/ui/menus.html#PopupMen )?
更新(解決策):
最終的なコードスニペットは、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;
}
はいあります。
addSubMenu
メソッドは、 SubMenu
オブジェクトを返します。 SubMenu
は Menu
でもあるので、add
を呼び出して、親メニューではなくサブメニューにアイテムを追加できます。上記のコードは、単一の新しいフォームサブメニュー内の2つのアイテムではなく、フォーム1とフォーム2の2つの異なるサブメニューを作成しています。
例:
SubMenu submenu = menu.addSubMenu(0, Menu.NONE, 1, "New Form").setIcon(R.drawable.ic_new_form);
submenu.add("Form 1").setIcon(R.drawable.attachment);
ActionProviderを追加する方が簡単かもしれません。説明どおりに試すことができます here
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();
}
}