以前的片段在新片段下可见

时间:2013-05-20 05:32:52

标签: android android-actionbar android-viewpager

我有一个标签+ ViewPager布局,在其中一个标签中我有一个列表视图。当我在onclick上替换该列表片段时,我仍然可以看到新片段下的旧片段。参见:

enter image description here

代码:

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。

7 个答案:

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

快乐编码:)

相关问题