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:

 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); } 

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

Introduzca aquí la descripción de la imagen

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.