FragmentTransaction没有做任何事情

我正在学习片段,下面给出的是我的第一个片段程序。 一个简单的项目,我有2个屏幕。 当我点击第一个屏幕的下一个button时,需要显示第二个button。

在这里输入图像说明

我的目标是Android 2.1及以上,并使用兼容性包

AppMainFragmentActivity.java

public class AppMainFragmentActivity extends FragmentActivity { @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.app_main_layout); } } 

app_main_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/fragment_container"> <fragment class="com.research.fragmentstudy.FirstFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/id_first_fragment"/> </LinearLayout> 

FirstFragment.java

 public class FirstFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.first_fragment_layout , container,false); Button nextButton =(Button) view.findViewById(R.id.button); nextButton.setOnClickListener(nextListener); return view; } private OnClickListener nextListener = new OnClickListener() { @Override public void onClick(View v) { FragmentManager fm = ((AppMainFragmentActivity)FirstFragment.this .getActivity()).getSupportFragmentManager(); SecondFragment fragment = new SecondFragment(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.fragment_container, fragment); ft.commit(); } }; } 

first_fragment_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/first_fragment_root"> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="Fragment 1" android:gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:id="@+id/button" android:text="Next" /> </LinearLayout> 

SecondFragment.java

 public class SecondFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.second_fragment_layout, container,false); return view; } } 

second_fragment_layout.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/first_fragment_root"> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="Fragment 2" android:gravity="center_horizontal" /> </LinearLayout> 

那么我得到的第一个屏幕好吧。 现在,

我期望的,从我对碎片的理解

  • 当我点击屏幕1中的Nextbutton时,SecondFragment被创build,其onCreate()onCreateView()被调用。
  • 显示SecondFragment,并且FirstFragment被破坏(因为我没有将它添加到后台堆栈中)。 由于默认片段事务没有animation,因此不会有任何animation。

发生什么事

  • SecondFragment正在创build好,它的onCreate()onCreateView()被调用。
  • 但FirstFragment仍然在屏幕上,第二个永远不会显示。

现在我对片段的理解可能是错误的。 但我相信,当我们提交()一个片段事务时,第一个片段应该被第二个replace(第一个被隐藏或销毁)。 那么似乎没有任何事情发生。 这是为什么? 我们应该手动销毁/隐藏第一个片段吗?

注:我知道这样一个基本的事情是一个长期的问题。 但我把我的整个代码,因为我不知道我搞砸了。

Solutions Collecting From Web of "FragmentTransaction没有做任何事情"

那么我得到它的工作。 正确地给出这个问题的两个答案说明了我的代码无法按预期工作的一个原因。 但是在我的代码中有2个错误。

使用fragmentTransaction.add()将不会显示旧的片段。 你需要调用replace()。 答案是正确的。

但是我的代码还有一个错误。 您无法replace在xml中静态创build的片段。 所以我改变了

app_main_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/fragment_container"> </LinearLayout> 

AppMainFragmentActivity.java

 public class AppMainFragmentActivity extends FragmentActivity { @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.app_main_layout); FragmentManager fragmentManager = getSupportFragmentManager(); FirstFragment fragment = new FirstFragment(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.fragment_container,fragment); fragmentTransaction.commit(); } } 

你尝试使用ft.replace(R.id.fragment_container,片段),而不是添加? 添加不会删除现有的片段。

您正在尝试在fragment_container中添加一个片段,它正在添加,但您的片段不会显示,因为您已将id_first_fragment的宽度和高度指定为fill_parent,因此请尝试为id_first_fragment片段设置wrap_content。 当你点击button时,你可以看到下一个片段。 如果你想closures第一个片段并显示第二个片段,则需要replace而不是添加。