with viewpager tab showing practice not example best and android tabs android-viewpager fragment android-listfragment

showing - tab layout and viewpager android



Reemplazar ListFragment con Fragment dentro de ViewPager con pestaƱas (1)

Intento configurar la siguiente navegación en mi aplicación:

Condición real: ViewPager + pestañas para deslizar entre las listas:

  • ListFragment A
  • ListFragment B

Condición deseada: ViewPager + Tabs:

  • ListFragment A onListItemSelected replace ListFragment A con DetailFragment A
  • ListFragment B onListItemSelected replace ListFragment B con DetailFragment B

El objetivo es mostrar los fragmentos de detalles dentro de la navegación de pestañas. No puedo reemplazar la lista de fragmentos por un fragmento de detalle (la lista de fragmentos no tiene un diseño personalizado y, por lo tanto, no tiene ID Y no sé cómo hacerlo). Además, comenzar una nueva actividad oculta la barra de pestañas.

¿Puede alguien ayudarme?


Haría un fragmento envoltorio que sabe qué mostrar: lista o detalles. Esto se desacoplaría por completo de ViewPager ; el localizador solo sabría que contiene fragmentos de contenedor, y estos administrarían el contenido ellos mismos.

La implementación sería en esta línea:

public class WrapperFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyListFragment list = new MyListFragment(); list.setListAdapter(adapter); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> l, View v, int position, long id) { // Create details fragment based on clicked item''s position Fragment details = new Fragment(); getChildFragmentManager() .beginTransaction() .replace(R.id.container, details) .addToBackStack(null) .commit(); } }); getChildFragmentManager() .beginTransaction() .add(R.id.container, list) .commit(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // There has to be a view with id `container` inside `wrapper.xml` return inflater.inflate(R.layout.wrapper, container, false); } public class MyListFragment extends ListFragment { private OnItemClickListener listener; public void setOnItemClickListener(OnItemClickListener l) { this.listener = l; } @Override public void onListItemClick(ListView l, View v, int position, long id) { if(listener != null) { listener.onItemClick(l, v, position, id); } } } }

wrapper.xml . La idea es que WrapperFragment tiene que proporcionar un diseño que contenga una vista con el container id, porque estamos usando view con este id para poner el fragmento hijo - MyListFragment o MyListFragment .

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout>

De otra manera. Esto debería funcionar, pero tendrás que probarlo (el diseño tiene su propia id , en lugar de tener un container hijo con identificador):

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"/>