Intereting Posts
Разбор HTML в Android WebView бросает приемник не зарегистрирован: android.widget.ZoomButtonsController GoogleService не удалось инициализировать Воспроизведение youtube видео в приложении для Android Android Studio – проблемы с Lollipop, ADB и Genymotion: устройства не появятся. «Сервер adb устарел. убийство …» Android – отправлено плохое уведомление – не удалось расширить RemoteViews для: StatusBarNotification Изменение продолжительности анимации ViewPager при программном программировании Столбец «приложение» Android logcat всегда пуст Таблицы ширины 100% не работают в Gmail Android Разница между push-сообщениями GCM и PARSE Android делает номера телефонов доступными, автоопределяет Data Binding Android – параметр T имеет несовместимые верхние границы: ViewDataBinding и MainActivity Как правильно сохранить диалог с помощью поворота? Как разместить текстовое изображение с использованием позиции x, y Прикрепить onClickListener to ToggleButton

После того, как фрагмент изменения конфигурации из backstack теперь использует FrameLayout?

Проблемы с приложением:

При изменении ориентации приложение испытывает эти проблемы:

  • И FragmentA, и FragmentC теперь занимают контейнер FrameLayout.

Что работает: все работает так, как я хочу … до поворота экрана.

Краткое описание операции:

EditActivity Назначение: редактирование полей коллекции и элементов.

Фрагменты этого действия программно создают:

  • FragmentA – фрагмент для редактирования полей коллекции
  • FragmentB – ListFragment элементов в коллекции
  • FragmentC – фрагмент для редактирования полей элемента.

Первоначальный макет: FragmentA сидит на вершине FragmentB, каждый в своем собственном FrameLayouts.

Когда пользователь нажимает элемент списка FragmentB: замените FragmentA на FragmentC, чтобы разрешить пользователю редактировать поля этого элемента. Теперь FragmentC сидит на вершине FragmentB.

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

Почему пример Android Fragment Guide не работает для меня: их пример очень похож на то, что я делаю, но их фрагмент детали либо открывается в новом действии, либо в собственном кадре в текущем действии, они не выполняют никаких действий Заменяя фрагменты, поэтому я не могу понять, как они будут использовать onSaveIstanceState для сохранения видимых фрагментов, а затем использовать эту информацию в onCreate для воссоздания пользовательского интерфейса, который был там до изменения ориентации.

РЕДАКТИРОВАТЬ: вытащил одну проблему, обрушив и поместив в список XML-фрагмент, это решило бесконечную проблему «загрузки …».

Solutions Collecting From Web of "После того, как фрагмент изменения конфигурации из backstack теперь использует FrameLayout?"

Решаемые. О, кроличьи дыры, в которые я путешествовал … Во всяком случае, если вы столкнетесь с такими проблемами, как это, рассмотрите несколько вещей:

  • В конечном итоге мне не пришлось писать код в onSaveInstanceState(Bundle outState) .
  • В конечном счете мне не приходилось принимать какие-либо соображения относительно обработки backstack в onSaveInstanceState или иметь дело с ним в onCreate .
  • Когда сначала «добавление» фрагментов программно в FrameLayout, replace вместо «add» – это, вероятно, является одним из корней моих проблем.
  • In onCreate check, если пакет savedInstanceState имеет значение null, if(savedInstanceState == null) , и если это тогда, я знаю, что активность ранее не была разрушена изменением конфигурации, поэтому здесь я создаю фрагменты, которые должны отображаться прямо на Запуск активности. Другие фрагменты, которые программно onCreate() в другом месте (т. onCreate() Позже, чем активность onCreate() ), они не принадлежат к if , они принадлежат else :
  • else onSaveInstanceState != null и я знаю, что есть только одна причина, по которой эта вещь не является нулевой, потому что система сделала пакет с именем outState в onSaveInstanceState(Bundle outState) и спрятала его в методе onCreate где я теперь могу получить мои жалобы. Так вот, я знаю пару вещей:
    1. Конечно, фрагменты, которые я создал в onCreate активности, все еще являются частью активности (я не onCreate и не уничтожал их), но я не могу сделать ту же самую претензию в отношении фрагментов, вызванных действиями пользователя, эти фрагменты могут Или не может быть на данный момент (во время ориентации или изменения конфигурации), присоединенного к этой операции.
    2. Это хорошее место для предложения, if-this-thing-is-attached . Одна из вещей, которую я изначально испортил, я не смог передать ВСЕ из моих программно добавленных фрагментов тега; Предоставить все программно добавленные теги фрагментов. Затем я узнаю, содержит ли пакет savedInstanceState этот ключ с savedInstanceState.containsKey(MY_FRAG_TAG) и с getFragmentManager().findFragmentByTag(MY_FRAG_TAG)

Итак, вот работа onCreate (упрощенная):

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit); // ...omitted code... if(savedInstanceState == null){ // create fragment for collection edit buttons editCollection = FragmentA.newInstance(someVariable); // programmatically add fragment to ViewGroup getFragmentManager().beginTransaction().replace(R.id.edit_topFrame, editCollection, EDIT_COLLECTIONS_TAG).commit(); } // else there be stuff inside the savedInstanceState bundle else{ // fragments that will always be in the savedInstanceState bundle editCollectionFragment = (FragmentA)getFragmentManager().findFragmentByTag(EDIT_COLLECTIONS_TAG); // fragments that may not be in the bundle if(savedInstanceState.containsKey(EDIT_ITEM_TAG)){ editItemFragment = (FragmentC)getFragmentManager().getFragment(savedInstanceState, EDIT_ITEM_TAG); } } // This fragment is NOT programmatically added, ie, it is statically found in an XML file. // Hence, the system will take care of preserving this fragment on configuration changes. listFrag = (ListViewFragment)getFragmentManager().findFragmentById(R.id.ListFragment); // create adapter adapter = new EditCursorAdapter(this, null); // set list fragment adapter listFrag.setListAdapter(adapter); // prepare the loader getLoaderManager().initLoader(LOADER_ID, null, this); } 

И прослушиватель Activity для фрагмента списка, где FragmentC заменяется на FragmentA:

 // listfragment listener @Override public void listFragListener(Cursor cursor) { // checking backstack size Log.d(TAG, SCOPE +"backstack size: "+getFragmentManager().getBackStackEntryCount()); // With each listview click there should be only one item in the backstack. getFragmentManager().popBackStack(); // create new fragment editItemFragment = FragmentC.newInstance(cursor); // programmatically add new fragment FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.edit_topFrame, editItemFragment, EDIT_ITEM_TAG); ft.addToBackStack("pop all of these"); // was testing different ways of popping ft.commit(); // interesting: this reports the same value as the first log in this method. // ...clearly addToBackStack(null).commit() doesn't populate the backstack immediately? Log.d(TAG, SCOPE +"backstack size: "+getFragmentManager().getBackStackEntryCount()); } 

И onSaveInstanceState голый, как птица-джей:

  @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } 

Реферат: У меня есть деятельность, функционирующая точно так, как я этого хочу.

Теперь, если бы у меня была куча добавленных фрагментов, я мог бы обрабатывать их более программным способом, а не жестким кодированием if(savedInstanceState.contains(*hard coded key*) . Это я немного протестировал, но не могу подтвердить его Эффективность, однако для кого-то там может возникнуть идея о том, что вы можете сделать:

  1. Сделайте собственный набор добавленных фрагментов:

     // Collection of Frag Tags private Set<String> AddedFragmentTagsSet = new HashSet<String>(); 
  2. В onAttachFragment выполните что-то вроде:

     @Override public void onAttachFragment(Fragment fragment) { super.onAttachFragment(fragment); // logging which fragments get attached and when Log.d(TAG, SCOPE +"attached fragment: " +fragment.toString()); // NOTE: XML frags have not frigg'n tags // add attached fragment's tag to set of tags for attached fragments AddedFragmentTagsSet.add(fragment.getTag()); // if a fragment has become detached remove its tag from the set for(String tag : AddedFragmentTagsSet){ if(getFragmentManager().findFragmentByTag(tag).isDetached()){ AddedFragmentTagsSet.remove(tag); } Log.d(TAG, SCOPE +"contents of AddedFragmentTagsSet: " +tag); } } 
  3. Затем в onCreate и внутри savedInstanceState :

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit); // ...omitted code... if(savedInstanceState == null){ // create fragment for collection edit buttons editCollection = FragmentA.newInstance(someVariable); // programmatically add fragment to ViewGroup getFragmentManager().beginTransaction().replace(R.id.edit_topFrame, editCollection, EDIT_COLLECTIONS_TAG).commit(); } // else there be stuff inside the savedInstanceState bundle else{ // fragments that will always be in the savedInstanceState bundle editCollectionFragment = (FragmentA)getFragmentManager().findFragmentByTag(EDIT_COLLECTIONS_TAG); //////////// find entries that are common to AddedFragmentTagsSet & savedInstanceState's set of keys /////////// Set<String> commonKeys = savedInstanceState.keySet(); commonKeys.retainAll(AddedFragmentTagsSet); for(String key : commonKeys){ editItemFragment = FragmentC)getFragmentManager().getFragment(savedInstanceState, key); } } } 

… но это непроверено и представлено просто для того, чтобы искушать идеи; Пытаясь выяснить, что было не так с обработкой моей деятельности изменений конфигурации, я споткнулся и пошатнулся в этом направлении и подумал, что это может принести плоды правильному человеку; Хотя, в конечном счете, очевидно, я нашел более простой способ исправить свои проблемы на этот раз.