当ActionMode被其他片段替换时,如何关闭它

时间:2016-10-14 04:50:18

标签: android listview android-fragments fragment-backstack

ListView中使用Fragment时出现问题。当我使用MultiChoiceModelListener时,当我长按ActionMode中的项目时,它会显示ListView

问题是:

  1. ActionMode被激活,并且用户用其他片段替换该片段时,动作模式仍然存在,请看下面的图片。
  2. 当我使用ActionMode mode = null并实例化mode变量onCreateActionMode并在onDestroyActionModeonDestroyView中实现它时,请查看代码段代码。 第一个问题已解决,但是打开了另一个问题,因为片段方向更改时,mode.finish()会调用onDestroyView ListView中的已检查项目消失。
  3. 当我删除onDestroyView()方法时,我解决了第二个问题问题第一个问题再次打开。< / LI>

    enter image description here

    这是我的代码段:

    //My ActionModeListener
    private class MyActionMode implements AbsListView.MultiChoiceModeListener {
    
            @Override
            public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) {
                String nfile = ((DataFileProvider) adapter.getItem(i)).getNfile();
                if (b) {
                    selections.add(nfile);
                } else {
                    selections.remove(nfile);
                }
                actionMode.setTitle(selections.size() + " " + getString(R.string.item_selected));
            }
    
            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                mode = actionMode;
                getActivity().getMenuInflater().inflate(R.menu.list_file_action_mode, menu);
                return true;
            }
    
            @Override
            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                actionMode.setTitle(selections.size() + " " + getString(R.string.item_selected));
                return true;
            }
    
            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                return true;
            }
    
            @Override
            public void onDestroyActionMode(ActionMode actionMode) {
                selections.clear();
                mode = null;
                showMessage("ListDocFileFragment : onDestroyActionMode");
            }
        }
    

    当处理片段livecycle

    时,这是我的代码段
    //My OnResume,OnPause,and OnDestroyView in Fragment
    @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments() != null) {
                default_location = getArguments().getString("default_location");
            }
            if (getActivity().getIntent().hasExtra("ActionMode")) {
                selections = getActivity().getIntent().getStringArrayListExtra("ActionMode");
            }
        }
    
        @Override
        public void onResume() {
            super.onResume();
            if(selections.isEmpty() && list_doc_file.getCheckedItemCount() > 0){
                for (int i = 0; i < adapter.getCount(); i++) {
                    list_doc_file.setItemChecked(i, false);
                }
                selections.clear();
            }
            showMessage("ListDocFileFragment : onResume");
        }
    
        @Override
        public void onPause() {
            if (selections != null) {
                getActivity().getIntent().putExtra("ActionMode", selections);
            }
            showMessage("ListDocFileFragment : onPause");
            super.onPause();
        }
    
        @Override
        public void onDestroyView() {
            if(mode != null){
                mode.finish();
            }
    
            showMessage("ListDocFileFragment : onDestroyView");
            super.onDestroyView();
        }
    

    我的问题是如何解决上面的三个问题没有打开像我这样的另一个问题?

    我在这个堆栈中搜索另一个解决方案,但我一无所获。当我实施他们的解决方案时,它总会打开另一个问题。有什么建议吗?

0 个答案:

没有答案