android - fragment 中的上下文操作模式 - 如果不集中则关闭?

标签 android android-viewpager android-contextmenu android-actionmode

我在嵌套 fragment 中实现了上下文操作模式栏。此 fragment 是 View 寻呼机的一部分, View 寻呼机也是抽屉导航的 fragment 和一部分。

我的问题:如果 fragment 不再集中,我想关闭上下文操作模式栏。因此,如果我在 View 寻呼机中滑动,操作模式栏应该关闭。但是如果我使用嵌套 fragment 的onPause()方法,则不会直接调用该方法。通常它会等到我向前滑动两到三下...这是一些图片:

enter image description here

enter image description here

在第二张图片中,您可以看到操作模式栏仍然存在。所以我的问题是: 我应该在哪个方法中调用我的 actionModeBar.finish() 方法,以便在我离开 fragment 时直接关闭操作模式栏?

也许 fragment 的代码可以帮助您:

public class EditorFragment extends Fragment {

  private static final String KEY_POSITION="position";
  ListView listView;
  private boolean isMultipleList = false;
  private ActionMode acMode;
  private int counterChecked = 0;

  private ActionMode.Callback modeCallBack = new ActionMode.Callback() {

    public boolean onPrepareActionMode(ActionMode mode, Menu menu){
           return false;
       }

      public void onDestroyActionMode(ActionMode mode) {
          listView.clearChoices();
            for (int i = 0; i < listView.getChildCount(); i++)
                listView.setItemChecked(i, false);
                listView.post(new Runnable() {
                    @Override
                    public void run() {
                        listView.setChoiceMode(ListView.CHOICE_MODE_NONE);
                    }
                });
          isMultipleList = false;
          counterChecked = 0;
          mode = null;
       }

       public boolean onCreateActionMode(ActionMode mode, Menu menu) {
           mode.setTitle("1 Aufgabe");
           mode.getMenuInflater().inflate(R.menu.actionmode, menu);
           return true;
       }

       public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
           switch (item.getItemId()) {
           case R.id.actionmode_delete:
               int choiceCount = listView.getCount();
               SparseBooleanArray spBoolArray = listView.getCheckedItemPositions();

               DBAufgaben db = new DBAufgaben(MainActivity.getMContext());
               db.open();

               for (int i = 0; i < choiceCount; i++) {
                   if(spBoolArray.get(i)){
                       db.deletContact(listView.getItemIdAtPosition(i));
                   }

               }
                Cursor cursor = db.getAllRecords();
                AdapterEingang adapterE = new AdapterEingang(MainActivity.getMContext(), cursor, 0);
                listView.setAdapter(adapterE);
               db.close();
               mode.finish();
               break;
           case R.id.actionmode_cancel:
               mode.finish();
               break;
           }
           return false;
       }
    };

  //......//

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

      View rootView = null;
      int position = getArguments().getInt(KEY_POSITION, -1);

      switch(position){
      case 0:
          rootView = inflater.inflate(R.layout.pager_list, null);
          listView = (ListView) rootView.findViewById(R.id.pager_list);

          Context context = MainActivity.getMContext();

          DBAufgaben db = new DBAufgaben(context);

          db.open();
          Cursor cursor = db.getAllRecords();
          AdapterEingang adapterE = new AdapterEingang(context, cursor, 0);
          listView.setAdapter(adapterE);
          db.close();

          listView.setOnItemLongClickListener(new OnItemLongClickListener(){



                @Override
                public boolean onItemLongClick(AdapterView<?> adapterView, View view,
                        int position, long id) {
                    if(!isMultipleList){
                        acMode = MainActivity.getInstance().startActionMode(modeCallBack);
                        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
                        listView.setItemChecked(position, true);
                        isMultipleList = true;
                        counterChecked++;
                        setNewTitle();                      
                    } else {
                        listView.setItemChecked(position, true);
                        counterChecked++;
                        setNewTitle();
                    }

                    return true;
                }

              });
          listView.setOnItemClickListener(new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position,
                    long id) {
                Log.d(getTag(), "Datensatz: "+String.valueOf(id));
                if(isMultipleList){
                    if(listView.isItemChecked(position)){
                        listView.setItemChecked(position, true);
                        counterChecked++;
                        setNewTitle();
                    } else {
                        listView.setItemChecked(position, false);
                        counterChecked--;
                        setNewTitle();
                    }

                }

            }

          });
          break;
      default:
          rootView = inflater.inflate(R.layout.frag_dummy, null);
          TextView txt = (TextView) rootView.findViewById(R.id.dummy_txt);
          txt.setText(String.valueOf(position));
          break;
      }



      return(rootView);
  }
  public void setNewTitle(){
      if(counterChecked == 1){
            acMode.setTitle(counterChecked+" Aufgabe");
        } else {
            acMode.setTitle(counterChecked+" Aufgaben");
        }
  }
  @Override
  public void onPause(){
      super.onPause();
      if(isMultipleList){
          acMode.finish();
      }
  }
}

最佳答案

ViewPagers 在任何时候都保持多个页面处于 Activity 状态(默认情况下,当前显示页面之前的页面和之后的页面),因此在您滑动两页之前不会调用 onPause()。

您最好的选择是使用 ViewPager.OnPageChangeListener ,并在 onPageSelected(..) 中显示和隐藏 ActionMode(即,如果所选页面不是具有 ActionMode 的页面,则隐藏 ActionMode)。您可能必须在托管 ViewPager 的 Activity 中实现它。

关于android - fragment 中的上下文操作模式 - 如果不集中则关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18204386/

相关文章:

android - 如何在android中将数字转换为货币格式

android - 换行符\n 在 textView Android 中未正确显示

android - 停止预览后如何从表面清除预览框

android - 在android中删除 ListView 中的选定行

具有视差背景图像的 Android ViewPager

android - 使用 OnContextItemSelected 从 ListView 项中检索文本

java - onPageListener 不工作

android - 使用 TAG `android:switcher: + R.id.ot_pag_main + :0` 查找 fragment 是否安全?

android - 长按操作不会调用 onLongClick()

java - 如何将上下文菜单添加到表格布局?