嵌套 Android 片段问题 - 间歇显示什么都没有
Nested Android Fragment Issue - Intermitenting shows nothing
我有一个带有 TabLayout / FragmentPagerAdapter 的应用程序来控制四个选项卡。其中三个选项卡工作正常并显示它们各自的片段(没有问题)。第四个片段,间歇性地无法显示视图的内容。
我已经测试过,视图的 class 已加载,但没有内容。片段确实包含嵌套片段(它们不再嵌套),我认为这可能是导致问题的原因。以下是有问题的片段的 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">
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center">
</FrameLayout>
</LinearLayout>
下面是相关片段的 class。
public class MyFragmentLayout extends Fragment {
View view;
SubFragment1 subFragment1 = new SubFragment1();
SubFragment2 subFragment2 = new SubFragment2();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = inflater.inflate(R.layout.fragment_layout, container, false);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
return view;
}
public void showSubFragment2() {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment2);
fragmentTransaction.commit();
}
public void showSubFragment1() {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_right, R.animator.slide_out_left);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
}
}
澄清一下。我遇到的问题是在选项卡之间切换一段时间后。此视图,以及仅此视图,将不再显示。 TabLayout 似乎没有问题,因为它正在加载此 class。我希望有人能够提供一些解决这个问题的指导。
尝试调用 getChildFragmentManager()
而不是 getFragmentManager()
,看看是否有帮助。
您需要使用 getChildFragmentManager()
而不是 getFragmentManager()
来放置和管理片段内的片段。
所以
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = inflater.inflate(R.layout.fragment_layout, container, false);
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
return view;
}
public void showSubFragment2() {
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment2);
fragmentTransaction.commit();
}
public void showSubFragment1() {
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_right, R.animator.slide_out_left);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
}
我有一个带有 TabLayout / FragmentPagerAdapter 的应用程序来控制四个选项卡。其中三个选项卡工作正常并显示它们各自的片段(没有问题)。第四个片段,间歇性地无法显示视图的内容。
我已经测试过,视图的 class 已加载,但没有内容。片段确实包含嵌套片段(它们不再嵌套),我认为这可能是导致问题的原因。以下是有问题的片段的 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">
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center">
</FrameLayout>
</LinearLayout>
下面是相关片段的 class。
public class MyFragmentLayout extends Fragment {
View view;
SubFragment1 subFragment1 = new SubFragment1();
SubFragment2 subFragment2 = new SubFragment2();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = inflater.inflate(R.layout.fragment_layout, container, false);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
return view;
}
public void showSubFragment2() {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment2);
fragmentTransaction.commit();
}
public void showSubFragment1() {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_right, R.animator.slide_out_left);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
}
}
澄清一下。我遇到的问题是在选项卡之间切换一段时间后。此视图,以及仅此视图,将不再显示。 TabLayout 似乎没有问题,因为它正在加载此 class。我希望有人能够提供一些解决这个问题的指导。
尝试调用 getChildFragmentManager()
而不是 getFragmentManager()
,看看是否有帮助。
您需要使用 getChildFragmentManager()
而不是 getFragmentManager()
来放置和管理片段内的片段。
所以
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = inflater.inflate(R.layout.fragment_layout, container, false);
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
return view;
}
public void showSubFragment2() {
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment2);
fragmentTransaction.commit();
}
public void showSubFragment1() {
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_right, R.animator.slide_out_left);
fragmentTransaction.replace(R.id.fragmentContainer, subFragment1);
fragmentTransaction.commit();
}