替换的片段在背景上仍然可见

Posted

技术标签:

【中文标题】替换的片段在背景上仍然可见【英文标题】:Fragment replaced still visible on background 【发布时间】:2013-05-22 04:46:42 【问题描述】:

我正在尝试使用新的抽屉式导航模式将一个片段替换为另一个片段。它似乎有效,但是当我从抽屉中选择另一个选项时,新片段已加载,但两个片段都是可见的。我没有使用静态片段布局,所以我不知道问题出在哪里。

片段是通过在我的活动上实现AdapterView.OnItemClickListeneronItemClick 方法加载的。

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    Fragment fragmentToShow = null;
    // Load desired fragment
    switch (position) 
        case 0: // Authors
            if (fragmentAuthors == null) fragmentAuthors = new FragmentAuthors();
            fragmentToShow = fragmentAuthors;
            break;
        case 1: // Books
            if (fragmentBooks == null) fragmentBooks = new FragmentBooks();
            fragmentToShow = fragmentBooks;
            break;
    
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.replace(R.id.ActivityMain_Drawer_FrameMain, fragmentToShow);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ft.commit();
    mDrawerLayout.closeDrawers();

布局

<!-- The main content view -->
<FrameLayout
    android:id="@+id/ActivityMain_Drawer_FrameMain"
    android:layout_
    android:layout_
    android:background="@android:color/background_light" />

<!-- The navigation drawer -->
<FrameLayout
    android:id="@+id/ActivityMain_Drawer_FrameMenu"
    android:layout_
    android:layout_
    android:layout_gravity="start"
    android:background="@android:color/background_light">
    <ListView
        android:id="@+id/ActivityMain_Drawer_FrameMenu_List"
        android:layout_
        android:layout_
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />
</FrameLayout>

截图

https://dl.dropboxusercontent.com/u/1763308/Screenshots/device-2013-05-27-113128.png https://dl.dropboxusercontent.com/u/1763308/Screenshots/device-2013-05-27-113139.png

【问题讨论】:

【参考方案1】:

我对一些片段有同样的问题。为了解决这个问题,我简单地为所有片段布局设置背景颜色,例如:

android:background="?android:attr/colorBackground"

【讨论】:

嗯,我自己也有同样的问题,但肯定这个答案只是掩盖了问题,应该停止片段,而不是让参考保持并被背景颜色隐藏 我猜这会增加过度绘制,使您的 ui 动画不那么流畅。这并不能解决您的问题,而是从字面上隐藏它。【参考方案2】:

我在 SO 上尝试了很多建议的答案,经过几个小时后,我终于可以解决我的问题,而无需在我的片段布局上指定背景颜色。

我的解决方案是在持有片段容器的 Activity 上重写 onBackPressed 方法,所以每次按下后退按钮时,我都会移除当前显示的片段并带回上一个片段:

@Override
public void onBackPressed() 
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if (fragments.size() > 1) 

        final Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.my_framelayout);
        if (currentFragment != null) 
            getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
            getSupportFragmentManager().popBackStack();
        
     else 
        super.onBackPressed();
    

希望这会有所帮助。

【讨论】:

【参考方案3】:

尝试改变 android:background="@android:color/background_light" 颜色到其他颜色。也许这可以解决你的问题。

【讨论】:

我已经测试过更改为静态颜色,如 'android:background="#F00"` 或使用系统颜色引用,但结果是相同的。两个片段都会显示,并且它们不响应输入。 参考此页developer.android.com/training/implementing-navigation/… 尝试下载示例项目并将其与您现有的项目进行比较。尝试删除 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);这条线并运行。 好的,我已经尝试在每个 Frame 和每个 Fragment 布局上设置背景颜色,它似乎工作正常。但是现在我有另一个问题,每个加载的片段加载一次都可以,但是如果我再次加载它们,ListViews 是空的。每个 ListView 都有一个 ArrayAdapter,它在每个 Fragment 的 onActivityCreated 被调用时加载。 我再次尝试更改扩展 ListFragment 而不是使用带有自定义布局的 Fragment 并且它可以工作。任何人都知道我必须使用 Fragment 类调用哪种方法来自动刷新?

以上是关于替换的片段在背景上仍然可见的主要内容,如果未能解决你的问题,请参考以下文章

设置 EditText 光标颜色

当您尝试通过 alpha 隐藏 SearchBar 时,背景视图仍然可见

当替换片段视频仍在android中播放背景时

添加片段后,前一个片段仍然可见

另一个片段问题的片段

当片段被替换并且再次可见时回调