Intereting Posts

Замена фрагмента на другой фрагмент внутри группы действий

У меня есть фрагмент внутри групповой активности, и я хочу заменить его другим фрагментом:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); SectionDescriptionFragment bdf = new SectionDescriptionFragment(); ft.replace(R.id.book_description_fragment, bdf); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(null); ft.commit(); 

Он отлично работает, когда он выполняется как отдельный проект без использования группы действий, все отлично работает в лог-cat, поскольку элемент управления находится внутри getview (), но вид не виден, даже не возникает никаких исключений. Я хочу, чтобы фрагмент детали книги Заменить фрагмент детали фрагмента.

Xml фрагмента детали книги имеет id book_description_fragment и xml для фрагмента описания раздела имеет id section_description_fragment.

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

Solutions Collecting From Web of "Замена фрагмента на другой фрагмент внутри группы действий"

Фрагменты, жестко закодированные в XML, не могут быть заменены. Если вам нужно заменить фрагмент на другой, вы должны добавить их динамически, в первую очередь.

 // Create new fragment and transaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack if needed transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); 

Пожалуйста, ознакомьтесь с этим вопросом

Вы можете заменить только « динамически добавленный фрагмент ».

Итак, если вы хотите добавить динамический фрагмент, см. Этот пример.

Используйте приведенный ниже код в android.support.v4

  FragmentTransaction ft1 = getFragmentManager().beginTransaction(); WebViewFragment w1 = new WebViewFragment(); w1.init(linkData.getLink()); ft1.addToBackStack(linkData.getName()); ft1.replace(R.id.listFragment, w1); ft1.commit(); 

Я сделал суть с идеальным методом для управления заменой фрагментов и жизненным циклом .

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

Он содержит несколько опций, как будто вы хотите, чтобы фрагмент был сохранен в backstack.

=> См. Здесь Gist

Используя это и одно действие, вы можете добавить это в свою деятельность:

 @Override public void onBackPressed() { int fragments = getSupportFragmentManager().getBackStackEntryCount(); if (fragments == 1) { finish(); return; } super.onBackPressed(); } 

Используйте этот код, используя v4

  ExampleFragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction.replace(R.id.container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); 

Надеюсь, что вы преуспеваете. Когда я начал работать с Android Fragments меня также была такая же проблема, тогда я прочитал примерно 1. Как переключить фрагмент с другим. 2- Как добавить фрагмент, если в Fragment container нет никакого фрагмента.

То после некоторых НИОКР я создал функцию, которая помогает мне во многих проектах до сих пор, и я все еще использую эту простую функцию.

 public void switchFragment(BaseFragment baseFragment) { try { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) { ft.add(R.id.home_frame, baseFragment); } else { ft.replace(R.id.home_frame, baseFragment); } ft.addToBackStack(null); ft.commit(); } catch (Exception e) { e.printStackTrace(); } } 

Наслаждайтесь кодовым временем 🙂