我有一个标签+ ViewPager
布局,在其中一个标签中我有一个列表视图。当我在onclick上替换该列表片段时,我仍然可以看到新片段下的旧片段。参见:
代码:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
HallsInStateFragment hallsForState = new HallsInStateFragment();
transaction.replace(R.id.container, hallsForState);
transaction.addToBackStack(null);
transaction.commit();
其中R.id.container
是视图中的FrameLayout。
答案 0 :(得分:7)
而不是R.id.container将像这样的片段的id放在((ViewGroup)getView().getParent()).getId()
中。实际上它不是替换片段而是替换先前的布局,即FrameLayout。它适用于我,我希望它也适用于你的情况。
答案 1 :(得分:3)
当需要从父视图中删除所有视图时,您需要在片段的 onCreateView()方法中的容器处调用 removeAllViews()。
以下是代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
container.removeAllViews(); // Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_example, container, false);
}
答案 2 :(得分:2)
片段的UI是活动视图层次结构的一部分。因此,如果您在onCreateView()方法中创建了视图,则使用ViewGroup容器扩展布局。此容器保留对片段视图的引用。尝试覆盖片段的onDestroyView()方法并从父级中删除所有视图:
@Override
public void onDestroyView() {
//mContainer.removeAllViews();
ViewGroup mContainer = (ViewGroup) getActivity().findViewById(R.id.container);
mContainer.removeAllViews();
super.onDestroyView();
}
答案 3 :(得分:0)
在根视图中添加%{THE_REQUEST}
并添加替换当前片段的片段的背景颜色(两者都在xml中)。
它只是修复解决方法
答案 4 :(得分:0)
将此添加到两个片段父布局
android:background="@android:color/white"
。
您要替换的一个和您要替换的一个。
答案 5 :(得分:0)
您的片段应像这样加载到FrameLayout
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:windowBackground" />
此功能应在此frameLayout
中添加/加载您的片段
private fun switchFragment(
fragment: Fragment,
addToBackstack: Boolean
) {
//check new fragment is alredy loaded currently, then return
val myFragment =
supportFragmentManager.fragments.lastOrNull()//return current visible fragment or null
if (myFragment != null && fragment::class == myFragment::class) {
return
}
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
//transaction.add(R.id.frameLayout, fragment, fragment.javaClass.name)
transaction.replace(
R.id.frameLayout,
fragment,
fragment.javaClass.name
)//using replace will make sure that the previous fragment won't be visible from new fragment
if (addToBackstack) {
transaction.addToBackStack(fragment.javaClass.name)
}
transaction.commit()
}
因此,最初,您的第一个片段应该像这样加载,
switchFragment(HomeFragment(), false)
,然后从底部导航视图或导航抽屉中选择其他片段时,请像这样调用此函数
switchFragment(MyProfileFragment(), true)
答案 6 :(得分:0)
最佳代码。清楚,没有使用另一台设备。 在您的活动onCreate上或在添加片段之前,请添加以下代码:
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment instanceof NavigationDrawerFragment) {
continue;
}
else if (fragment != null) {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
}
快乐编码:)