片段更改时Android刷新操作栏和标题

时间:2014-02-17 13:02:21

标签: android android-fragments android-actionbar

在我的应用中,我正在使用NAVIGATION_MODE_TABS - 模式中的操作栏开发活动。 每个选项卡都显示一个片段(列表,详细信息)。 最初列表选项卡是可见的。 该列表正在实施setMultiChoicheModeListener(),如果选择了一个或多个项目,则会修改ActionBar和活动的标题。 当用户点击详细信息选项卡而不取消选择项目时,如何将标题和ActionBar重置为初始值(标题和操作)?

BTW目标平台> 4.1我没有使用支持库。

感谢。

public class MyActivity extends Activity {

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        this.actionBar = getActionBar();
        this.actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ....
        for (Tab tab : getTabs())
        {
           //here are two tabs added (List and Detail)
           this.actionBar.addTab(tab);
        }
        ....
    }

    protected class NavigationTabListener implements ActionBar.TabListener {

        private Fragment fragment;
        ....
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
           ft.replace(newFragmentResourceId, this.fragment);
        }
    }
}

public class MyListViewFragment extends LinearLayout implements IListViewFragment {

     ....

     @Override
     public void initialize() {
         inflate(getContext(), listLayoutResourceId, this); 
         this.myList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
         this.myList.setMultiChoiceModeListener(new MultiChoiceModeListener() {

        ....

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu)
        {
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(selectedItemsMenuResourceId, menu);

            return true;
        }

        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked)
        {
            if (checked)
            {
                this.numberItemsSelected++;
                adapter.setNewSelection(position);
            }
            else
            {
                this.numberItemsSelected--;
                adapter.removeSelection(position);
            }

            mode.setTitle(getContext().getResources().getQuantityString(
                R.plurals.items_selected, this.numberItemsSelected,
                Integer.valueOf(this.numberItemsSelected)));

         }

         ....

     }
}

我正在尝试实施MVP模式,但它仍处于评估阶段。 Activity充当演示者,视图位于不同的类中。

对于每个片段,我也在实现MVP apttern,但我认为这对解决问题并不感兴趣。

课程的一些注释:

MyActivity创建两个片段(一个用于List,一个用于Detail视图,详细视图与所选项目无关)。 活动的初始视图是带有列表的片段。 如果用户选择了某些条目,我将通过MultiChoiceModeListener的回调更新操作栏和标题。 但是用户现在可以通过单击“详细信息”选项卡更改片段而不取消选择项目或单击操作栏中的新元素,结果是显示了详细信息片段,但活动的标题仍然是我在MultiChoiceModeListener中修改了一个,并且还有可见的操作栏的复选标记(由系统自动创建)。 所以最好的方法是我想以某种方式得到当前ActionMode,所以我可以调用finish()来“重置”ActionBar和标题。

1 个答案:

答案 0 :(得分:0)

确保您在活动中ActionMode方法中ActionMode.Callback继续引用ActionBar.TabListener。 选择新选项卡后,只需完成操作模式,如:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
           if(mActionMode != null){
              mActionMode.finish();
           }
           ft.replace(newFragmentResourceId, this.fragment);

 }

调用ActionMode时,将onDestroyActionMode(ActionMode)引用恢复为null。