Modo de acción contextual en el fragmento – cerrar si no se centra?

I implementó una barra de modo de acción contextual en un fragmento anidado. Este fragmento es parte de un buscapersonas de vista y el paginador de vistas es también un fragmento y parte de un cajón de navegación.

Mi problema: Quiero cerrar la barra de modo de acción contextual si el fragmento no está más enfocado. Por lo tanto, si paseo por el buscapersonas de vista, la barra de modo de acción debe cerrar. Pero si utilizo el método onPause() del fragmento anidado, el método no se llama directamente. A menudo espera hasta que hice pasar dos o tres veces adelante … He aquí algunas fotos:

Introduzca aquí la descripción de la imagen

Introduzca aquí la descripción de la imagen

En la segunda imagen se puede ver que la barra de modo de acción todavía está allí. Así que mi pregunta es: ¿En qué método debo llamar a mi método actionModeBar.finish() , para cerrar directamente la barra de modo de acción si dejo el fragmento?

Tal vez el código del fragmento le ayude:

 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 mantiene varias páginas activas en cualquier momento (de forma predeterminada, la página anterior y la página después de la página que se muestra actualmente), por lo que onPause () no se llama hasta que elimine dos páginas.

Su mejor ViewPager.OnPageChangeListener sería usar un ViewPager.OnPageChangeListener , y mostrar y ocultar el ActionMode en onPageSelected(..) (es decir, si la página seleccionada no es la que tiene el ActionMode, ocultar el ActionMode). Es probable que tenga que implementar esto en la actividad que aloja su ViewPager.

Esto funcionó para mí:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { if (!isVisibleToUser && this.listView != null) { //HACK this is done in order to finish the contextual action bar int choiceMode = this.listView.getChoiceMode(); this.listView.setChoiceMode(choiceMode); } } 

Combiné el código del OP con el override sugerido por el usuario pomber:

  • ActionMode el ActionMode en un campo de clase cuando se crea el modo de acción.
  • Configure el campo de nuevo a null cuando se destruye el modo de acción.
  • Anular setUserVisibleHint en mi fragmento y llamar a ActionMode#finish() si el fragmento no está visible en el paginador de vista.
  • También llamo a ActionMode#finish() en el método onPause() del fragmento para cerrar el fragmento si el usuario navega por otra parte.

Código:

 @Nullable ActionMode mActionMode = null; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Start out with a progress indicator. setListShownNoAnimation(false); setEmptyText(getText(R.string.no_forms_in_progress)); getListView().setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL); getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { // Here you can do something when items are selected/de-selected, // such as update the title in the CAB } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context_saved_item, menu); inflater.inflate(R.menu.context_instance_list, menu); mActionMode = mode; return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.action_delete: confirmDelete(getListView().getCheckedItemIds()); return true; case R.id.action_print: print(getListView().getCheckedItemIds()); return true; } return false; } @Override public void onDestroyActionMode(ActionMode mode) { mActionMode = null; } }); } @Override public void onPause() { super.onPause(); if (mActionMode != null) { mActionMode.finish(); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (mActionMode != null && !isVisibleToUser) { mActionMode.finish(); } } 

Esto es lo que funcionó para mí –

  1. Mantenga una referencia estática al modo de acción en MyFragment:

public static ActionMode mActionMode;

  @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mActionMode = mode; return true; } @Override public void onDestroyActionMode(ActionMode mode) { mActionMode = null; } 
  1. Establecer ViewPager.OnPageChangeListener en MyViewPagerActivity.
  mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { .... @Override public void onPageScrollStateChanged(int state) { if(MyFragment.mActionMode != null) MyFragment.mActionMode.finish(); } }); 
  • Android: pestañas sin barra de acción
  • Índice de fragmentos de resultados de actividad Fuera del rango: 0x20001
  • Android: Cómo implementar viewpager y vistas en un único archivo xml
  • Los fragmentos no se liberan de la memoria
  • Viewpager no se desplaza en el diseño del coordinador
  • Los fragmentos ViewPager no se inician en onCreate
  • Android ViewPager Detectar desplazamiento vertical
  • Excepción de puntero NULL de getSupportFragmentManager de Android en Fragmento
  • No se puede cambiar la etiqueta del fragmento
  • Cómo hacer desplazamiento circular en ViewPager?
  • Implementar vista como ver paginador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.