我尝试实现一个可以将不同片段加载到一个容器视图元素中的活动。我关注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; (即不只是设置背景颜色)来解决这个问题?
答案 0 :(得分:2)
我在onCreate
注意到了这一点:
getSupportFragmentManager()
,这在onOptionsItemSelected
:
getFragmentManager()
FragmentManager
实际上有AppCompatActivity
的两个版本,他们对彼此一无所知。因此,当您告诉android.app.FragmentManager
替换android.support.v4.app.FragmentManager
添加的片段时,它不知道有关FirstFragment
的任何内容,因此该操作更像是添加而非替换。
我不止一次犯了这个错误。您需要梳理代码,并确保使用支持类与常规类保持一致。