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"/>