Intereting Posts
Исключение Android Amazon S3: «Указанный ключ не существует» Создайте курсор для указания массива Ripples не отображается с помощью selectableItemBackground как планшет на CardView с устройством Android 5.0 Передача параметров через URI в Android Как я могу отправить данные обратно из onPostExecute в AsyncTask? Удаление текста в виде кнопки Как создать Insecure RFCOMM Socket в Android? Задача Android Gradle: connectedInstrumentTest для выпуска сборки? Метод anko toast () вызывает java.lang.NoSuchMethodError при вызове из фрагмента Как включить учетные записи в новом API Android для Google Диска Каков правильный способ связи с пользовательским представлением на активность, в которой он находится? Android: java.lang.IllegalAccessException при попытке использовать пользовательский класс «Приложение» Подключить 2 или более Android-клиентов напрямую 2 значка приложений после установки release apk, используя функцию градации Не удалось найти следующие классы: – android.support.design.widget.TextInputLayout

Где вызвать getChildFragmentManager ()?

проблема

Согласно документам Google:

Теперь вы можете вставлять фрагменты внутри фрагментов. Это полезно для различных ситуаций, в которых вы хотите разместить динамические и повторно используемые компоненты пользовательского интерфейса в компонент пользовательского интерфейса, который сам по себе является динамическим и может использоваться повторно. Например, если вы используете ViewPager для создания фрагментов, которые прокручиваются влево и вправо и потребляют большую часть пространства экрана, теперь вы можете вставлять фрагменты на каждую страницу фрагмента. Чтобы вставить фрагмент, просто вызовите getChildFragmentManager () на фрагменте, в который вы хотите добавить фрагмент. Это возвращает FragmentManager, который вы можете использовать, как обычно, из операции верхнего уровня для создания транзакций фрагментов. Например, вот какой-то код, который добавляет фрагмент из существующего класса фрагментов:

Fragment videoFragment = new VideoPlayerFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.video_fragment, videoFragment).commit(); 

Таким образом, у меня было (например) TestFragment которое выглядит так:

 public class TestFragment extends Fragment { private View mFragmentView; private FrameLayout mFrameLayout; public HistoryFragment() { super(); } @Override public View onCreateView(LayoutInflater pInflater, ViewGroup pViewGroup, Bundle pBundle) { mFragmentView = pInflater.inflate(R.layout.fragment_layout, pViewGroup, false); mFrameLayout = (FrameLayout) mFragmentView.findViewById(R.id.framelayout); return mFragmentView; } public void onDestroyView() { super.onDestroyView(); } /* ISSUE */ public void doSomethingSpecial() { FragmentManager tFragmentManager = getChildFragmentManager(); } } 

В MainActivity я инициализирую свой фрагмент следующим образом:

 mTestFragment = new TestFragment(); mTestFragment.doSomethingSpecial(); 

Затем я ViewPager фрагмент в ViewPager через FragmentPagerAdapter .

Наконец, я получаю исключение. Но если я использую только:

 mTestFragment = new TestFragment(); 

Тогда это работает.

Вопрос

Где я должен вызвать метод getChildFragmentManager() в моем фрагменте? Что я делаю неправильно?

Если у вас есть хороший пример использования новых Android Nested Fragments, поделитесь ссылкой со мной. Я был бы очень признателен за вашу помощь.

Solutions Collecting From Web of "Где вызвать getChildFragmentManager ()?"

Короткий ответ: я вызываю и использую getChildFragmentManager() в onViewCreated() моего фрагмента.

Например:

 @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); addInnerFragment(); // This method does the getChildFragmentManager() stuff. } 

На самом деле я просто использовал в следующем случае.

Я пытался добавить карту в ViewPager. Как вы знаете, «страницы» в ViewPager являются фрагментами, поэтому я не смог использовать этот код Sample, используя карты из Activity . Я пытался получить SupportMapFragment из Activity, делающего такие вещи, как:

 SupportMapFragment mapView = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map); 

Но mapView всегда был нулевым, поэтому мое приложение вылетает из строя.

Я нашел следующий ответ и работает посмертно.

Это может быть полезным примером, где можно использовать getChildFragmentManager ()

Надеюсь, это может быть полезно.

Согласно документам , этот метод:

Верните частный FragmentManager для размещения и управления фрагментами внутри этого фрагмента.

Поэтому вы можете использовать его, если хотите добавить / заменить новый фрагмент на существующий фрагмент, сначала выполнить транзакцию TestFragment, а затем добавить к нему внутренний фрагмент. Попробуйте что-то вроде этого:

  TestFragment mTestFragment = new TestFragment(); //get the activity's fragment manager to add the fragment FragmentTransaction transaction= getFragmentManager().beginTransaction(); transaction.add(R.id.container, mTestFragment).commit(); //add the inner fragment mTestFragment.doSomethingSpecial();