【问题标题】:Replaced fragment still visible behind new fragment替换的片段在新片段后面仍然可见
【发布时间】:2016-11-03 04:29:19
【问题描述】:

我尝试实现一种可以将不同片段加载到一个容器视图元素中的活动。我关注Building a Flexible UI Training。问题:替换片段时,我仍然可以在后台看到被替换的片段。

我看到我的问题已经被问过很多次了。但是,我找到的所有答案似乎都只是一种解决方法(设置片段的背景颜色)或不适用。

这是我到目前为止的设置:

活动的 XML 布局包含一个 FrameLayout 作为片段的容器:

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

id fragment_container 在项目的其他地方没有使用。

第一个片段的完整 XML 布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="First Fragment" />

第二个片段的完整XML布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textColor="#ff0000"
    android:text="Fragment Second" />

第一个片段的类文件如下所示(第二个片段的类类似):

public class FirstFragment extends Fragment {

    public FirstFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_first, container, false);
    }

}

在活动的 onCreate 方法中,我加载了第一个片段:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // load first fragment
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, new FirstFragment())
                .commit();
    }
}

选择菜单项时,我尝试将第一个片段用第二个片段替换为活动的 onOptionsItemSelected方法:

getFragmentManager().beginTransaction()
        .replace(R.id.fragment_container, new SecondFragment())
        .addToBackStack(null) // <-- does not make any difference if left out
        .commit();

结果是文本“Fragment Second”以红色打印在文本“First Fragment”上方。

解决此问题的“正确方法”(即不只是设置背景颜色)是什么?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    我在onCreate 中注意到了这一点:

            getSupportFragmentManager()
    

    这个在onOptionsItemSelected:

            getFragmentManager()
    

    AppCompatActivity 中实际上有两个版本的FragmentManager,它们彼此一无所知。因此,当您告诉android.app.FragmentManager 替换由android.support.v4.app.FragmentManager 添加的片段时,它对FirstFragment 一无所知,因此该操作更像是添加而不是替换。

    我不止一次犯过这个错误。您需要梳理您的代码,并确保您在使用支持类和常规类方面保持一致。

    【讨论】:

    • 都是因为你说onOptionsItemSelected属于活动。在一个片段中,getFragmentManager() 总是做正确的事情,因为常规片段只知道常规的FragmentManager,而支持片段只知道支持片段。如果你没有说它是活动的onOptionsItemSelected,我会假设你是从片段中调用它,这不会有任何问题。
    • 优秀的答案!!克里斯拉尔森你救了我的一天谢谢你
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多