如何创build包含片段的Android选项卡式对话框?

任何人都可以指向我的例子,或告诉我如何在Android中创build一个简单的Tabbed Dialog ,其中每个选项卡的内容是Fragments ? 我find的所有示例/教程都是关于片段和制表符的,但没有特定于DialogFragments

FragmentTabHost的文档展示了如何使用getChildFragmentManager()在普通片段中创build制表符。 我假设这应该也工作时,片段是一个DialogFragment但是当我尝试它,我得到:

 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) ... 

这是我的代码设置视图(然后传递给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); } 

Solutions Collecting From Web of "如何创build包含片段的Android选项卡式对话框?"

花了很多时间才能使它工作,但没有运气。 我find的唯一的解决scheme是创build虚拟片段tabhost和使用viewpager片段而不是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> 

Dialog类,诀窍就是使用onCreateView而不是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); } }); } } } 

这是结果,现在你可以按标签或刷卡片段

在这里输入图像说明

我正在寻找相同的解决scheme,但没有任何解决scheme,所以我build立了自己的Android选项卡式对话框包含片段。 可能是它可能帮助某人。

你可以从这里检查完整的源代码

你应该使用DialogFragmentTabLayoutViewPager 。 例如,您的对话框片段的视图可能如下所示:

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

build立你的适配器,并确保你重写getPageTitleMethod,例如:

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

在你的对话框的OnCreateView中,你应该用tabLayout来设置你的viewpager:

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

我在这里写了一篇博客文章: 这里 。

尝试使用DialogFragment来代替,并且在您的dialogfragment布局中包含一个用于fragmentTransaction的LinearLayout。

 FragmentTransaction t = getSupportFragmentManager().beginTransaction(); String Tag = fragment.getClass().getSimpleName(); t.replace(R.id.llTabFragmentContainer, fragment, Tag); t.commit(); 

片段是你的标签片段。 cheeers