Android: обновить элементы ActionBar в зависимости от каждого фрагмента в ViewPager?

У меня есть кнопка флага/закладки в панели действий, в которую я хочу включить или выключить, в зависимости от того, какой фрагмент имеет вид ViewPager.

Если пользователь помещает фрагмент в ViewPager, он будет установлен на включен. Когда пользователь переходит к следующему, я хочу, чтобы кнопка панели действий обновлялась до незаполненной. Теперь я могу изменить состояние кнопки, имея два пункта меню и спрятать их, показывая один при нажатии.

Здесь код в моей операции для переключения кнопки панели действий:

public boolean onOptionsItemSelected(MenuItem item) {
    int currentItem = mPager.getCurrentItem();
    switch (item.getItemId()) {
    case R.id.menu_flag:
        mFlagged = true;
        supportInvalidateOptionsMenu();
        return true;
    case R.id.menu_unflag:
        mFlagged = false;
        supportInvalidateOptionsMenu();
        return true;
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem item_flag = menu.findItem(R.id.menu_flag);
    MenuItem item_unflag = menu.findItem(R.id.menu_unflag);
    if (mFlagged) {
        //If flagged
        //Show flagged item
        item_flag.setVisible(false).setEnabled(false);
        item_unflag.setVisible(true).setEnabled(true);
        item_flag.isVisible();
    } else {
        //If not flagged
        //Show unflagged icon
        item_flag.setVisible(true).setEnabled(true);
        item_unflag.setVisible(false).setEnabled(false);
    }

    return super.onPrepareOptionsMenu(menu);
}

Проблема, с которой я столкнулась, заключается в том, что я не могу получить доступ к элементу меню, сохранять и восстанавливать состояние кнопки, т.е. если оно помечено или нет из фрагмента или FragmentPagerAdapter.

Как я могу это сделать? На каком уровне я должен обращаться к панели действий; Активность, PagerAdapter или фрагменты?

Ответы

Ответ 1

Регистрация ViewPager.OnPageChangeListener на вашем ViewPager должна сделать трюк. Затем переопределите onPageSelected (int pageNum) для получения обратных вызовов при изменении страницы.

public void onPageSelected(int pageNum) {
     supportInvalidateOptionsMenu();}