как мы можем добавить пункт меню динамически

привет, друзья, я создаю приложение, которое представляет собой вкладку.

в моем доме, который расширяет sherlockFragmentActivity, я раздуваю menu.xml и включаю код для прослушивателя кликов optionMenuitem. Fragmentactivity содержит tabhost и на каждой вкладке загружает фрагменты. это мое меню.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>

и это мои методы onCreateOptionMenu и onOptionItemSelected в классе Home

    @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;
    }

мне нужно добавить некоторые меню в зависимости от смены вкладок. то есть при изменении вкладки я загружаю разные фрагменты, и при изменении фрагмента мне нужно добавить новые элементы в меню. мой ListFrag, который расширяет SherlockFragment и загружается, когда я нажимаю на 3-ю вкладку. когда этот фрагмент загружается, мне нужно добавить 1 пункт меню в меню


person Vikky    schedule 26.06.2013    source источник


Ответы (5)


Попробуйте следующим образом.

@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);
    }

Это может помочь вам.

person Gunaseelan    schedule 26.06.2013
comment
мне нужно динамически добавлять новый пункт меню при загрузке определенного фрагмента - person Vikky; 26.06.2013
comment
вы проверили этот вопрос? - person Gunaseelan; 26.06.2013
comment
в классе фрагментов нам нужно добавить эту строку setHasOptionsMenu (true); другие вещи такие же, как деятельность - person Vikky; 26.06.2013
comment
Можете ли вы опубликовать эту ссылку в качестве ответа и небольшого описания ?? - person Vikky; 26.06.2013

В menu.xml вы должны добавить все пункты меню. Затем вы можете скрыть элементы, которые не хотите видеть при начальной загрузке.

<item
    android:id="@+id/action_newItem"
    android:icon="@drawable/action_newItem"
    android:showAsAction="never"
    android:visible="false"
    android:title="@string/action_newItem"/>

Добавьте setHasOptionsMenu(true) в метод onCreate() для вызова пунктов меню в вашем классе Fragment.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

Вам не нужно снова переопределять onCreateOptionsMenu в вашем классе Fragment. Пункты меню можно изменять (добавлять/удалять), переопределяя onPrepareOptionsMenuметод, доступный во Фрагменте.

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_newItem).setVisible(true);
    super.onPrepareOptionsMenu(menu);

}
person Parinda Rajapaksha    schedule 04.03.2015

вот пример...может поможет...

  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;
person ashish.n    schedule 26.06.2013
comment
моя проблема в том, как добавить другой пункт меню для разных фрагментов - person Vikky; 26.06.2013

на основе ответа Гунасилана

@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;
}
person Lotfi    schedule 27.10.2017

используйте метод onPrepareOptionsMenu и сначала очистите все меню, используя

menu.clear();

затем добавьте меню.

Также см. здесь. . проверьте его onPrepareOptionsMenu метод

person CRUSADER    schedule 26.06.2013