Дублирование фрагментов на транзакции фрагментов

Хорошо, всякий раз, когда я пытаюсь заменить фрагмент в моем приложении, он только добавляет фрагмент внутри контейнера, другой фрагмент, и оставляет текущий фрагмент. Я попытался вызвать замену и ссылку на представление, содержащий фрагмент, и путем ссылки на сам фрагмент. Ни одна из них не работает. Я могу добавить фрагмент к представлению с помощью диспетчера транзакций фрагмента, но даже если я попытаюсь удалить его после его добавления, он не работает. Любая помощь будет оценена по достоинству. Вот мои файлы.

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar. final ActionBar actionbar = getActionBar(); actionbar.setDisplayShowTitleEnabled(false); actionbar.setDisplayUseLogoEnabled(true); actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true); actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this)); Fragment fragment = new insert_button_frag(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.button_fragment, fragment); transaction.addToBackStack(null); transaction.commit(); } 

Вот макет

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:id="@+id/button_fragment_container" android:layout_width="fill_parent" android:layout_height="wrap_content" > <fragment android:name="com.bv.silveredittab.home_button_frag" android:id="@+id/button_fragment" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <fragment android:name="com.bv.silveredittab.quick_insert_frag" android:id="@+id/quick_insert_frag" android:layout_width="350dip" android:layout_height="fill_parent" /> <fragment android:name="com.bv.silveredittab.editor_frag" android:id="@+id/editor_frag" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> </LinearLayout> 

И вот фрагмент кода

 public class insert_button_frag extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); return inflater.inflate(R.layout.insert_buttons,container, false); } } 

Как я уже сказал. Я попытался ссылаться на родительское представление фрагментов, чтобы заменить его, и сам фрагмент (по id), и все же он добавляет только новый фрагмент внутри встроенного представления, в котором находится исходный фрагмент.

Solutions Collecting From Web of "Дублирование фрагментов на транзакции фрагментов"

Я решил это, используя местозаполнитель в моем макете, а затем прикрепляю к нему фрагмент во время выполнения.

Как и вы, если бы я создал экземпляр своего фрагмента в моем XML-макете, содержимое останется видимым после замены его другим фрагментом во время выполнения.

Проблема заключается в этой строке:

 transaction.replace(R.id.button_fragment, fragment); 

replace имеет две перегруженные формы. В обоих из них первый аргумент – это контейнер фрагмента, который нужно заменить, а не сам фрагмент. Итак, в вашем случае вам нужно позвонить

 transaction.replace(R.id.button_fragment_container, fragment); 

Edit: Я вижу в вашем вопросе, что вы пробовали оба. Я проверил и проверил поведение. Это похоже на ошибку в API FragmentTransaction.

Edit2: не ошибка в конце концов. Вы просто не можете заменить фрагменты, добавленные статически в файл макета. Вы можете заменить только те, которые вы добавили программным способом ( Android: не может заменить один фрагмент на другой )

Я была такая же проблема. Взгляните на эту ссылку: Android Fragment Duplication

Интересно, что тот факт, что вы передаете контейнер в метод inflater.inflate (), заставляет его создавать новый фрагмент внутри старого вместо оптовой замены. Я предлагаю «null» моим надувным устройствам в рабочей версии.

Вот основные сведения о версии, с которой я работаю …

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View newFrag = new View(getActivity().getApplicationContext()); newFrag = inflater.inflate(R.id.frag, null); return newFrag; } 

Руководство разработчика Google довольно сбивает с толку, потому что оно показывает сначала реализовать жесткий фрагмент кода в xml. Но если вы действительно хотите заменить существующий фрагмент на новый, вы должны добавить его (первый) во время выполнения.

Какое официальное состояние сайта

FragmentTransaction replace (int containerViewId, фрагмент фрагмента, тег String)

Замените существующий фрагмент, который был добавлен в контейнер. Это по существу то же самое, что и вызов remove (Fragment) для всех добавленных в настоящее время фрагментов, которые были добавлены с тем же контейнером, и затем добавьте (int, Fragment, String) те же аргументы, приведенные здесь.

Вы должны заметить, что в нем говорится, что заменить существующий фрагмент, который был добавлен в контейнер

Итак, ваш xml должен выглядеть как someActivity.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ... tools:context="someActivity"> <ImageView .../> <LinearLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="bottom"/> </RelativeLayout> 

И чем в вашей деятельности делать в OnCreate ()

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); [...] getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, new FirstFragment).commit(); } 

Чем вы можете легко заменить фрагмент своей анимацией и событием, добавьте ее обратно в стек, чтобы сохранить его состояние.

 private SecondFrag getSecondFrag(){ if(secondFrag == null) secondFrag = new SecondFrag() return secondFrag; } private void openRechargeFragment(){ FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.show_frag, R.anim.hide_frag, R.anim.show_frag, R.anim.hide_frag); ft.replace(R.id.fragment_container, getSecondFrag(), "myTAG"); ft.addToBackStack(null); ft.commit(); }