Intereting Posts
Проблема кодирования строк в Webview API Google Maps для Android: поддержкаMapFragment vs MapFragment Как найти максимальный размер изображения для изображений контактов? Могу ли я использовать d3.js для создания интерактивных визуализаций внутри приложения Android? Как использовать API голосовых команд в Android Реализация планшета Gmail, такого как навигационный ящик Фильтр ListAdapter, кроме использования строк? Android Facebook SDK 4.X, как получить адрес электронной почты и токен доступа Facebook, чтобы передать его веб-службе Android: как создать фон из шаблона? Gradle error: доступ к записи разрешен из потока сообщений только в студии android Какая доля устройств Android выигрывает от оптимизации Libjpeg-turbo? Автоматическое обновление приложения с использованием HockeyApp SDK Настройка Android AVD Command Line Hardware Profile Unsatisfiedlinkerror в android (eclipse) Изменения разрешений, требующие обновления вручную

Как заменить фрагмент активности из самого фрагмента?

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

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

Является ли это возможным? Если да, то как это сделать?

Solutions Collecting From Web of "Как заменить фрагмент активности из самого фрагмента?"

Фактически легко вызвать операцию, чтобы заменить фрагмент.

Вам нужно нажать getActivity ():

((MyActivity) getActivity()) 

Затем вы можете вызвать методы из MyActivity, например:

 ((MyActivity) getActivity()).replaceFragments(Object... params); 

Конечно, это предполагает, что у вас есть метод replaceFragments () в вашей деятельности, который обрабатывает процесс замены фрагмента.

Изменить: @ismailarilik добавил возможный код replaceFragments в этом коде с первым комментарием ниже, который был написан @ silva96:

Код replaceFragments может быть:

 public void replaceFragments(Class fragmentClass) { Fragment fragment = null; try { fragment = (Fragment) fragmentClass.newInstance(); } catch (Exception e) { e.printStackTrace(); } // Insert the fragment by replacing any existing fragment FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.flContent, fragment) .commit(); } 

Из официальных документов:

 // 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 transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); 

В этом примере newFragment заменяет любой фрагмент (если он есть) в настоящее время в контейнере макета, идентифицированном идентификатором R.id.fragment_container . addToBackStack() , замененный фрагмент сохраняется в addToBackStack() стеке, поэтому пользователь может отменить транзакцию и вернуть предыдущий фрагмент, нажав кнопку «Назад».

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

http://developer.android.com/guide/components/fragments.html

Обратите внимание, что фрагмент НЕ должен непосредственно заменять себя или любые другие фрагменты. Фрагменты должны быть отдельными объектами. Какой фрагмент должен сделать, так это сообщить о своей родительской активности, что произошло какое-то событие. Но это опять-таки не фрагментная работа, чтобы решить, что с этим делать! Это должна быть деятельность, чтобы принять решение о замене фрагмента на телефоне, а именно на добавление другого к существующему на планшетах. Таким образом, вы в основном делаете что-то неправильно по дизайну.

И, как уже упоминалось ранее, ваша работа должна использовать FragmentManager («родной» или из библиотеки совместимости) для выполнения задания (например, replace() или add() или remove() ):

http://developer.android.com/guide/components/fragments.html

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