こんにちはfrndsは、タブアプリケーションであるアプリケーションを作成しています。
sherlockFragmentActivityを拡張する私のホームでは、menu.xmlを膨らませて、optionMenuitemクリックリスナーのコードを含めています。 Fragmentactivityはtabhostを含み、各タブでフラグメントをロードします。これは私のmenu.xmlです
<item
Android:id="@+id/action_settings"
Android:orderInCategory="100"
Android:showAsAction="always"
Android:icon="@drawable/setting_selector"
Android:title=""
>
<menu >
<item
Android:id="@+id/Profile"
Android:showAsAction="ifRoom"
Android:title="Profile"/>
<item
Android:id="@+id/chngDoctor"
Android:showAsAction="ifRoom"
Android:title="Change doctor"
Android:visible="false"/>
<item
Android:id="@+id/changePword"
Android:showAsAction="ifRoom"
Android:title="Change password"/>
<item
Android:id="@+id/logout"
Android:showAsAction="ifRoom"
Android:title="Logout"/>
</menu>
</item>
これは、クラスHomeのonCreateOptionMenuおよびonOptionItemSelectedメソッドです。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
getSupportMenuInflater().inflate(R.menu.main, menu);
SubMenu subMenu = (SubMenu) menu.getItem(0).getSubMenu();
if(userType.equals("admin"))
subMenu.getItem(1).setVisible(true);
else
subMenu.getItem(1).setVisible(false);
return true;
}
これは私のonOptionItemSelectedメソッドです
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId()) {
case R.id.Profile:
break;
case R.id.changePword :
break;
case R.id.chngDoctor :
break;
case R.id.logout:
Home.this.finish();
break;
}
return true;
}
タブの変更に応じていくつかのメニューを追加する必要があります。つまり、タブの変更でさまざまなフラグメントをロードし、フラグメントの変更時に新しい項目をメニューに追加する必要があります。 SherlockFragmentを拡張した私のListFragで、3番目のタブをクリックするとロードされます。このフラグメントの読み込み時に、メニューに1つのメニュー項目を追加する必要があります
次の方法を試してください。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, 0, "Option1").setShortcut('3', 'c');
menu.add(0, 1, 0, "Option2").setShortcut('3', 'c');
menu.add(0, 2, 0, "Option3").setShortcut('4', 's');
SubMenu sMenu = menu.addSubMenu(0, 3, 0, "SubMenu"); //If you want to add submenu
sMenu.add(0, 4, 0, "SubOption1").setShortcut('5', 'z');
sMenu.add(0, 5, 0, "SubOption2").setShortcut('5', 'z');
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
// code for option1
return true;
case 1:
// code for option2
return true;
case 2:
// code for option3
return true;
case 4:
// code for subOption1
return true;
case 5:
// code for subOption2
return true;
}
return super.onOptionsItemSelected(item);
}
これはあなたを助けるかもしれません。
_menu.xml
_では、すべてのメニュー項目を追加する必要があります。その後、初期ロードで表示したくない項目を非表示にすることができます。
_<item
Android:id="@+id/action_newItem"
Android:icon="@drawable/action_newItem"
Android:showAsAction="never"
Android:visible="false"
Android:title="@string/action_newItem"/>
_
OnCreate()メソッドにsetHasOptionsMenu(true)
を追加して、Fragmentクラスのメニュー項目を呼び出します。
_@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
_
FragmentクラスのonCreateOptionsMenu
を再度オーバーライドする必要はありません。 Fragmentで使用可能なonPrepareOptionsMenu
methodをオーバーライドすることにより、メニュー項目を変更(追加/削除)できます。
_@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_newItem).setVisible(true);
super.onPrepareOptionsMenu(menu);
}
_
ここに例があります...それはあなたを助けるかもしれません...
private static final int MENU_ADD = Menu.FIRST;
private static final int MENU_LIST = MENU.FIRST + 1;
private static final int MENU_REFRESH = MENU.FIRST + 2;
private static final int MENU_LOGIN = MENU.FIRST + 3;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
if(enableAdd)
menu.add(0, MENU_ADD, Menu.NONE, R.string.your-add-text).setIcon(R.drawable.your-add-icon);
if(enableList)
menu.add(0, MENU_LIST, Menu.NONE, R.string.your-list-text).setIcon(R.drawable.your-list-icon);
if(enableRefresh)
menu.add(0, MENU_REFRESH, Menu.NONE, R.string.your-refresh-text).setIcon(R.drawable.your-refresh-icon);
if(enableLogin)
menu.add(0, MENU_LOGIN, Menu.NONE, R.string.your-login-text).setIcon(R.drawable.your-login-icon);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case MENU_ADD: doAddStuff(); break;
case MENU_LIST: doListStuff(); break;
case MENU_REFRESH: doRefreshStuff(); break;
case MENU_LOGIN: doLoginStuff(); break;
}
return false;
グナシーランの回答に基づく
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
menu.removeGroup(1);
if (iotsnames.isEmpty()) return true;
for (int i=0; i<iotsnames.size(); i++ ){
menu.add(1, i, 0, iotsnames.get(i) );
}
return true;
}
onPrepareOptionsMenu
メソッドを使用して、最初にすべてのメニューをクリアする
menu.clear();
次にメニューを追加します。
また ここを参照 .. onPrepareOptionsMenu
メソッドを確認してください