Вопрос по android – Фрагменты Android воссоздаются при смене ориентации

14

Я разрабатываю приложение, которое в основном имеет ActionBar. Когда мое приложение запускается, Activity создает фрагменты и прикрепляет их к каждой вкладке, поэтому при переключении я получаю разные представления.

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

SummaryFragment.onCreate(Bundle) line: 79   
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795  
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032  
FragmentManagerImpl.moveToState(int, boolean) line: 1014    
FragmentManagerImpl.dispatchCreate() line: 1761 
DashboardActivity(Activity).onCreate(Bundle) line: 864  
...

и затем я воссоздаю фрагменты как обычно. Таким образом, у меня есть «реальный» фрагменты, которые, как я ожидаю, будут работать правильно, и их & quot; скрытые & quot; Созданные Android аналоги, которые вызывают сбой моего приложения. Как я могу избежать этого поведения? Я уже пытался вызвать setRetainInstance (false) в SummaryFragment.

Спасибо

Ваш Ответ

4   ответа
0

лов макетов) для обеих ориентаций, вы можете установитьandroid:configChanges="keyboardHidden|orientation" к активности в вашем файле манифеста.

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

Это помогло мне, потому что я забываю обновлять свои файлы макетов после изменения портрета. Он получил меня примерно 5 раз.
Частично решено с вашим ответом. Поскольку большая часть рисунка выполняется динамически, я удаляю все виды и ретранслирую их в соответствии с новой ориентацией. Честно говоря, я не думаю, что это чистое решение, но я не могу помешать системе дико создавать фрагменты для меня ... Luke47
При подключении устройства к автомобильной док-станции, к телевизору или при любых других изменениях конфигурации произойдут неприятные вещи: фрагменты все равно будут воссозданы. android: configChanges это зло, если вы действительно не знаете, что делаете.
0

убедитесь, что она не существует. Если он существует, ничего не делайте ... Android создаст его для вас.

private void initFragment() {
        FragmentManager fragMgr = getSupportFragmentManager();
        if (fragMgr.findFragmentByTag(LEADERBOARD_FRAG_TAG) != null) { return; }
        frag = new HdrLeaderboardFragment();
        FragmentTransaction ft = fragMgr.beginTransaction();
        ft.replace(R.id.leaderboard_fragment_wrapper, frag, LEADERBOARD_FRAG_TAG);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.commit();
    }
При этом все равно добавляются два фрагмента ... один, который у меня уже был (как вы предлагали), и еще один, который буквально сводит меня с ума. Было бы так легко сбросить FragmentManager между изменениями ориентации ... Luke47
0

что есть лучшее решение, но это то, что я сделал в последней программе.

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

   public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);
    if (fragment != null) {
        if(fragment.getArguments() != null) {
            switch (fragment.getArguments().getString(ARG_PARAM1)) {
                case FragmentATag:
                    if (myFragmentA != fragment) {
                        myFragmentA = (FragmentA) fragment;
                    }                     
                    break;
                case FragmentBTag:
                    if (myFragmentB != fragment) {
                        myFragmentB = (FragmentB) fragment;
                    }                        
                    break;                  
            }
        }
     }
   }
39

в родительской активности], и, если оно существует, не создавайте свои фрагменты.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
         // Do your oncreate stuff because there is no bundle   
    }
// Do stuff that needs to be done even if there is a saved instance, or do nothing
}
Большое спасибо @Barak только решение сработало через неделю
не уверен, что это та же проблема, что и у ОП, но это было невероятно полезно для меня. Благодарю.

Похожие вопросы