Cómo crear un cuadro de diálogo con pestañas con Android que contiene fragmentos?
¿Puede alguien apuntarme a un ejemplo o mostrarme cómo crear un Tabbed Dialog
simple en Android donde el contenido de cada ficha es Fragments
? Todos los ejemplos / tutoriales que he encontrado son sobre Fragmentos y Tabulaciones, pero nada específico para DialogFragments
.
La documentación de FragmentTabHost
muestra cómo crear pestañas dentro de fragmentos normales usando getChildFragmentManager()
. Estoy asumiendo que esto también debería funcionar cuando el fragmento es un DialogFragment
pero cuando lo intento obtengo:
- El contenido de Tabhost no se muestra cuando actualizo android.support.v4
- Reemplazar un fragmento a otro fragmento en el TabHost
- FindFragmentByTag - buscando fragmento en FragmentTabHost - always null
- Cambiando dinámicamente los fragmentos dentro de un host de fichas de fragmentos?
- Cómo implementar pestañas personalizadas en Android como Instagram
java.lang.IllegalStateException: Fragment does not have a view at android.support.v4.app.Fragment$1.findViewById(Fragment.java:1425) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) ...
Aquí está mi código para configurar la vista (que se pasa a AlertDialog.setView()
):
private void setupView(View v) { mTabHost = (FragmentTabHost) v.findViewById(android.R.id.tabhost); mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent); mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Tab1"), MyDialogFragment.class, null); }
- FragmentTabHost no crea vista dentro de Fragmento en android
- Interfaz de Android
- Fragmento superpuesto
- ¿Es posible llamar manualmente onCreateView en un fragmento?
- ¿Son la etiqueta y el icono mutuamente excluyentes en un tabHost TabSpec setIndicator?
- IllegalStateException en FragmentManager
Pasó mucho tiempo para conseguir que funcione, pero no hay suerte. La única solución que encontré es crear tabhost fragmento ficticio y usar viewpager con fragmentos en lugar de fragmentos tabhost
Voters_dialog.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" > <android.support.v4.app.FragmentTabHost android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tabs" > </android.support.v4.app.FragmentTabHost> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"/> </LinearLayout>
Clase de diálogo, el truco es usar onCreateView no onCreateDialog
public class VotersDialog extends DialogFragment { private FragmentTabHost mTabHost; private ViewPager viewPager; private VotersPagerAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.voters_dialog, container); getDialog().setTitle(getArguments().getString("title")); mTabHost = (FragmentTabHost) view.findViewById(R.id.tabs); mTabHost.setup(getActivity(), getChildFragmentManager()); mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Плюсов"), Fragment.class, null); mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Минусов"), Fragment.class, null); adapter = new VotersPagerAdapter(getChildFragmentManager(), getArguments()); adapter.setTitles(new String[]{"Плюсов", "Минусов"}); viewPager = (ViewPager)view.findViewById(R.id.pager); viewPager.setAdapter(adapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i2) { } @Override public void onPageSelected(int i) { mTabHost.setCurrentTab(i); } @Override public void onPageScrollStateChanged(int i) { } }); mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { @Override public void onTabChanged(String s) { int i = mTabHost.getCurrentTab(); viewPager.setCurrentItem(i); } }); return view; } public class VotersPagerAdapter extends FragmentPagerAdapter { Bundle bundle; String [] titles; public VotersPagerAdapter(FragmentManager fm) { super(fm); } public VotersPagerAdapter(FragmentManager fm, Bundle bundle) { super(fm); this.bundle = bundle; } @Override public Fragment getItem(int num) { Fragment fragment = new VotersListFragment(); Bundle args = new Bundle(); args.putSerializable("voters",bundle.getSerializable( num == 0 ? "pros" : "cons")); fragment.setArguments(args); return fragment; } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { return titles[position]; } public void setTitles(String[] titles) { this.titles = titles; } } public static class VotersListFragment extends ListFragment { List<String> voters; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.list_fragment, container, false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); voters = (ArrayList) getArguments().getSerializable("voters"); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, voters); setListAdapter(adapter); getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Intent intent = new Intent(getActivity(), ProfileActivity_.class); String login = voters.get(i); intent.putExtra("login", Utils.encodeString(login.substring(0, login.indexOf("(")).trim())); startActivity(intent); } }); } } }
Aquí está el resultado, ahora puede presionar pestañas o deslizar fragmentos
Yo estaba buscando la misma solución, pero nada funcionó para mí, así que construí mi propio diálogo con pestañas de Android que contiene fragmentos. Podría ser que puede ayudar a alguien.
Puede comprobar el código fuente completo desde aquí
Debe utilizar un DialogFragment
, TabLayout
y ViewPager
. Por ejemplo, la vista de su fragmento de diálogo puede tener este aspecto:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <android.support.v4.view.ViewPager android:id="@+id/masterViewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
Construya su adaptador y asegúrese de anular el getPageTitleMethod, por ejemplo:
public class CustomAdapter extends FragmentPagerAdapter { List<Fragment> mFragmentCollection = new ArrayList<>(); List<String> mTitleCollection = new ArrayList<>(); public CustomAdapter(FragmentManager fm) { super(fm); } public void addFragment(String title, Fragment fragment) { mTitleCollection.add(title); mFragmentCollection.add(fragment); } //Needed for @Override public CharSequence getPageTitle(int position) { return mTitleCollection.get(position); } @Override public Fragment getItem(int position) { return mFragmentCollection.get(position); } @Override public int getCount() { return mFragmentCollection.size(); } }
En el OnCreateView
de su diálogo, debe configurar su viewpager con el tabLayout:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootview = inflater.inflate(R.layout.dialog_sample,container,false); tabLayout = (TabLayout) rootview.findViewById(R.id.tabLayout); viewPager = (ViewPager) rootview.findViewById(R.id.masterViewPager); CustomAdapter adapter = new CustomAdapter(getChildFragmentManager()); adapter.addFragment("Boy",CustomFragment.createInstance("John")); adapter.addFragment("Girl",CustomFragment.createInstance("Stacy")); adapter.addFragment("Robot",CustomFragment.createInstance("Aeon")); viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager); return rootview; }
Tengo una entrada en el blog escrita aquí: aquí .
Trate de utilizar DialogFragment en su lugar y en su diseño de diálogo de fragmentos incluyen un LinearLayout para fragmentTransaction.
FragmentTransaction t = getSupportFragmentManager().beginTransaction(); String Tag = fragment.getClass().getSimpleName(); t.replace(R.id.llTabFragmentContainer, fragment, Tag); t.commit();
Fragmento es el fragmento de la pestaña. Cheeers