FragmentTransaction ничего не делает

Я изучаю фрагменты, и ниже приведена моя первая программа фрагментов. Простой проект, где у меня есть 2 экрана. Когда я нажимаю следующую кнопку первого экрана, вторая кнопка должна быть показана.

enter image description here

я нацелен на 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 уничтожается (так как я не добавляя его в backstack). Не будет никакой анимации с транзакция фрагмента по умолчанию не имеет анимации.

что происходит

  • SecondFragment создается хорошо, его onCreate() и onCreateView() вызывается.
  • но FirstFragment остается на экране, а второй никогда не отображается.

теперь мое понимание фрагмента может быть неверной. Но я считаю, что когда мы совершаем () транзакцию фрагмента, первый фрагмент должен быть заменен вторым (первый либо скрывается, либо уничтожается). Кажется, ничего не происходит. Почему так? Должны ли мы вручную уничтожить / скрыть первый фрагмент?

примечание: Я знаю, что это длинный вопрос для такого базового вещь. Но я положил весь свой код, так как я не уверен, где я его испортил.

3 ответов


Ну, я заставил его работать. Оба ответа на эти вопросы правильно указывают одну из причин, по которой мой код не работает должным образом. Но в моем коде было 2 ошибки.

используя fragmentTransaction.add() не будет показывать новый фрагмент поверх старого. вам нужно вызвать replace (). Ответы были правильными.

но была еще одна ошибка в моем коде. Вы не можете заменить фрагмент, созданный статически в 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();           
    }
}

вы пробовали использовать ft.заменить (R. id.fragment_container, fragment) вместо add ? add не удалит существующий фрагмент.


вы пытаетесь добавить еще один фрагмент в fragment_container, он добавляет, но ваш фрагмент не будет виден, потому что вы указали ширину и высоту для id_first_fragment как fill_parent, поэтому попробуйте установить wrap_content для фрагмента id_first_fragment . вы можете увидеть следующий фрагмент при нажатии на кнопку . Если вы хотите закрыть первый фрагмент и показать второй, вам нужно заменить вместо добавления .