FragmentTransaction没有做任何事情(FragmentTransaction not

2019-07-31 14:14发布

我给学习片段和下面是我的第一个片段程序。 一个简单的项目,我有2个屏幕。 当我点击第一个屏幕上的一个按钮,第二个按钮需要显示。

我靶向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下一步按钮,创建SecondFragment,它onCreate()onCreateView()被调用。
  • SecondFragment所示,并FirstFragment被销毁(因为我不加它堆栈中)。 不会有任何动画,因为默认片段交易没有动画。

怎么了

  • 是越来越创建SecondFragment好了,它的onCreate()onCreateView()被调用。
  • 但FirstFragment保留在屏幕上,而第二个从不说明。

现在我的片段的认识可能是错误的。 但我相信,当我们提交()片段的交易,第一个片段应该由第二个代替(第一个无论是被隐藏或销毁)。 那么似乎没有任何发生。 这是为什么? 如果我们手动销毁/隐藏第一片段?

注:我知道这是对这样一个基本的东西很长的问题。 但是,我把我的全部代码,因为我不知道在那里我搞砸了。

Answer 1:

好吧,我得到它的工作。 给这个问题的两个答案正确地讲述了一个理由预期我的代码无法正常工作。 但也有我的代码2级的错误。

使用fragmentTransaction.add()将不会显示在旧的新片段。 你需要调用替换()。 给出的答案是正确的。

但是,在我的代码多了一个错误。 你不能取代XML静态创建一个片段。 所以我改变

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();           
    }
}


Answer 2:

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



Answer 3:

您正在尝试在fragment_container增加一个片段,它被添加,但你的碎片不会看到,因为你指定的宽度和高度id_first_fragment作为FILL_PARENT所以要尽量设置为WRAP_CONTENT片段id_first_fragment。 你可以看到下一个片段 - 当你点击按钮。 如果你想关闭第一片段和第二展示一个你需要更换,而不是加法。



文章来源: FragmentTransaction not doing anything