FragmentTransaction ничего не делает
Я изучаю фрагменты, и ниже приведена моя первая программа фрагментов. Простой проект, где у меня есть 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 уничтожается (так как я не добавляя его в 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 . вы можете увидеть следующий фрагмент при нажатии на кнопку . Если вы хотите закрыть первый фрагмент и показать второй, вам нужно заменить вместо добавления .