导航抽屉 + ViewPager - 片段不显示
Navigation drawer + ViewPager - fragments do not show
我创建的布局有问题。我使用 Navigation Drawer 作为主要的导航模式。它看起来和我想要的一样工作,但问题是在返回到包含 ViewPager
的片段之后 - 内部片段没有显示。但是,它们会在应用程序首次打开时显示,默认情况下会显示 ViewPager
-holding Fragment
。
其他导航抽屉 Fragments
显示正常,所以我不认为我的导航抽屉实施有任何问题
RecordFragment.java(片段持有ViewPager
Fragments
):
public class RecordFragment extends Fragment {
private ViewPager mViewPager;
public RecordFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.record_fragment, container, false);
//getActivity().setTitle(R.string.record);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewPager = (ViewPager) view.findViewById(R.id.record_pager);
FragmentManager manager = getFragmentManager();
mViewPager.setAdapter(new MyFragmentPagerAdapter(manager));
}
class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int item) {
Fragment fragment = null;
if (item == 0) {
fragment = new NumbersFragment();
} else if (item == 1) {
fragment = new MapFragment();
}
return fragment;
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
String title = new String();
if (position == 0) {
title = "Numbers";
} else if (position == 1) {
title = "Map";
}
return title;
}
}
}
NumbersFragment.java(RecordFragment
持有的Fragments
之一)
public class NumbersFragment extends Fragment {
public NumbersFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.numbers_fragment, container, false);
//getActivity().setTitle(R.string.record);
return rootView;
}
}
record_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/record_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#33b5e5"
android:textColor="#fff"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
</android.support.v4.view.ViewPager>
</LinearLayout>
您在另一个 Fragment
中使用 Fragment
s,在这种情况下您需要使用 Fragment#getChildFragmentManager() 方法:
FragmentManager manager = getChildFragmentManager();
如果它不起作用,您可以尝试切换到 FragmentStatePagerAdapter
而不是 FragmentPagerAdapter
(但您仍然需要使用子片段管理器)。
由于 ViewPager 需要 Fragments 和 ViewPager 本身在 Fragment 上,我们必须使用 getChildFragmentManager()
而不是 getSupportFragmentManager()
。
我创建的布局有问题。我使用 Navigation Drawer 作为主要的导航模式。它看起来和我想要的一样工作,但问题是在返回到包含 ViewPager
的片段之后 - 内部片段没有显示。但是,它们会在应用程序首次打开时显示,默认情况下会显示 ViewPager
-holding Fragment
。
其他导航抽屉 Fragments
显示正常,所以我不认为我的导航抽屉实施有任何问题
RecordFragment.java(片段持有ViewPager
Fragments
):
public class RecordFragment extends Fragment {
private ViewPager mViewPager;
public RecordFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.record_fragment, container, false);
//getActivity().setTitle(R.string.record);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewPager = (ViewPager) view.findViewById(R.id.record_pager);
FragmentManager manager = getFragmentManager();
mViewPager.setAdapter(new MyFragmentPagerAdapter(manager));
}
class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int item) {
Fragment fragment = null;
if (item == 0) {
fragment = new NumbersFragment();
} else if (item == 1) {
fragment = new MapFragment();
}
return fragment;
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
String title = new String();
if (position == 0) {
title = "Numbers";
} else if (position == 1) {
title = "Map";
}
return title;
}
}
}
NumbersFragment.java(RecordFragment
持有的Fragments
之一)
public class NumbersFragment extends Fragment {
public NumbersFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.numbers_fragment, container, false);
//getActivity().setTitle(R.string.record);
return rootView;
}
}
record_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/record_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#33b5e5"
android:textColor="#fff"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
</android.support.v4.view.ViewPager>
</LinearLayout>
您在另一个 Fragment
中使用 Fragment
s,在这种情况下您需要使用 Fragment#getChildFragmentManager() 方法:
FragmentManager manager = getChildFragmentManager();
如果它不起作用,您可以尝试切换到 FragmentStatePagerAdapter
而不是 FragmentPagerAdapter
(但您仍然需要使用子片段管理器)。
由于 ViewPager 需要 Fragments 和 ViewPager 本身在 Fragment 上,我们必须使用 getChildFragmentManager()
而不是 getSupportFragmentManager()
。