it-swarm.com.ru

Изменение значка меню параметров на панели действий в зависимости от открытого фрагмента

У меня есть этот пункт в моем меню настроек:

<item
    Android:id="@+id/opt_mnu_action"
    Android:icon="@Android:drawable/ic_dialog_info"
    Android:orderInCategory="1"
    Android:showAsAction="ifRoom"
    Android:title="New">
</item>

Само меню создано в основном FragmentActivity. Я хочу изменить значок этого элемента программно в зависимости от открытого фрагмента и, очевидно, выполнять различные действия, когда пользователь нажимает эту кнопку. Я пытался сделать несколько вещей, но ничего не получалось. Последнее, что я попробовал, был этот код в методе onCreateView моего фрагмента:

MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);

Но мое приложение упало. Так есть ли способ сделать это?

**ОБНОВИТЬ**

Вот что я пытаюсь сделать сейчас, все в моей основной функции FragmentActivity: Прежде всего, у меня есть MenuItem action_button; в моем иерархическом представлении. Затем в моем методе onCreateOptionsMenu я создаю его экземпляр:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    action_button = menu.findItem(R.id.opt_mnu_action);
    return super.onCreateOptionsMenu(menu);
}

Затем я создал эту функцию, чтобы изменить значок в соответствии с открытой вкладкой:

public void change_action_button_icon(int tab_position)
{
    switch(tab_position)
    {
    case 0:
        action_button.setIcon(R.drawable.ico_1);
        break;
    case 1:
        action_button.setIcon(R.drawable.ico_2);
        break;
    case 2:
        action_button.setIcon(R.drawable.ico_3);
        break;
    }
    invalidateOptionsMenu();
}

И я называю это в моем методе onTabSelected:

public void onTabSelected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
    mViewPager.setCurrentItem(tab.getPosition());
    setTab_position(tab.getPosition());
    change_action_button_icon(tab.getPosition());
}

Но как только я запускаю свое приложение - оно вылетает. Я получаю ошибку NullPointerException в этой строке:

action_button.setIcon(R.drawable.ico_1);

Полагаю, это происходит потому, что изменение значка было запрошено до того, как был создан экземпляр action_button. Но я не знаю, как это преодолеть ...

13
Igal

Используйте это, чтобы получить ссылку на пункт меню:

    menu.findItem(resourceId).setIcon(drawableId);

Вы должны поместить код для изменения значка в onCreateOptionsMenu ().

Пожалуйста, обратитесь к моему примеру ниже:

    public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    getMenuInflater().inflate(R.menu.option_menu, menu);

    if (needToChangeMenuItem){

        menu.findItem(resourceId).setIcon(drawableId);
    }

    manageMenuIcon(menu);

    needToChangeMenuItem = false;


    return true;
}


    public void manageMenuIcon(Menu menu){
    if (bluetoothIconOn){
        menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothon);
    } else
        menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothoff);

    if (gpsIconOn)
        menu.findItem(R.id.gps).setIcon(R.drawable.gps);
    else
        menu.findItem(R.id.gps).setVisible(false);

    if (slipAndDropIconOn)
        menu.findItem(R.id.fall).setIcon(R.drawable.fall);
    else
        menu.findItem(R.id.fall).setVisible(false);

    if (fesConnectIconOn)
        menu.findItem(R.id.fesConnection).setIcon(R.drawable.fesconnect);
    else
        menu.findItem(R.id.fesConnection).setVisible(false);


}


    public void changeMenuItem(int resId, int draId){


    needToChangeMenuItem = true;
    resourceId = resId;
    drawableId = draId;

    invalidateOptionsMenu();        


}
18
ksu
MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);

В onCreateOptionsMenu вашего фрагмента загрузите это меню и сохраните ссылку на этот пункт меню (он не является частью иерархии представления фрагмента, поэтому вы не можете использовать findViewById).

Всякий раз, когда вы готовы обновить значок, используйте mi.setIcon(R.drawable.ico_1); И вызывайте invalidateOptionsMenu().

ОБНОВЛЕНО:

return super.onCreateOptionsMenu(menu);

Это на самом деле вернет false, так как базовая реализация этого не делает. Вместо этого пропустите его или просто сначала вызовите super.onCreateOptionsMenu(menu);, сделайте свое дело, а затем верните true.

0
f2prateek

Сначала добавьте actionOverFlowButtonStyle в основную тему

<style name="AppTheme" parent="AppBaseTheme">

    <item name="Android:actionOverflowButtonStyle">@style/MyActionButtonOverflow</item>
</style>

Определите новый стиль для действия над кнопкой потока

<style name="MyActionButtonOverflow" parent="Android:style/Widget.Holo.Light.ActionButton.Overflow">
    <item name="Android:src">@drawable/ic_menu</item>
</style>
0
Null Pointer Exception