在新片段

时间:2016-11-02 19:37:33

标签: android android-fragments

我尝试实现一个可以将不同片段加载到一个容器视图元素中的活动。我关注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();

结果是文本&#34; Fragment Second&#34;在文本上方以红色印刷&#34; First Fragment&#34;。

&#34;正确的方式&#34; (即不只是设置背景颜色)来解决这个问题?

1 个答案:

答案 0 :(得分:2)

我在onCreate注意到了这一点:

        getSupportFragmentManager()

,这在onOptionsItemSelected

        getFragmentManager()

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

我不止一次犯了这个错误。您需要梳理代码,并确保使用支持类与常规类保持一致。