2013-05-19 2 views
9

Когда я запускаю приложение, он запускает AsyncTask для загрузки, а затем в onPostExecute, затем я setContentView в новый макет, затем добавляю фрагмент с двумя кнопками, предлагающими два режима, с помощью добавления FragmentTransaction. После нажатия одного из двух режимов он заменяет фрагмент еще одним FragmentTransaction с использованием метода replace.Замененный фрагмент все еще виден

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

Я исследовал и увидел эти два похожих вопроса, one и two, в которых предположилось, что это может быть из-за неправильного идентификатора или я определил фрагмент в XML. Ни один из этих двух факторов не имеет места.

Мой код показан ниже:

Ниже я заменить экран загрузки.

@Override 
    protected void onPostExecute(Void result) { 
     setContentView(R.layout.activity_main_screen); 
     FragmentTransaction transaction = getSupportFragmentManager() 
       .beginTransaction(); 
     transaction.add(R.id.fragment_container, new ModeFragment()) 
       .commit(); 
      } 

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

private void replaceCurrentFragment(Fragment fragment) { 
    FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment) 
      .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
      .addToBackStack(null).commit(); 
} 

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

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

ответ

11

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

Возможно, это не то же самое для вас, но это может помочь вам разобраться.

+1

Это должен быть комментарий, а не ответ. –

+7

Нет, это не так, это также подходит для ответа. – Zyoo

+0

Моя проблема заключалась в атрибуте фона в элементе HoloGraph (маленькой библиотеке для рисования диаграмм) в файле макета XML в сводке. Я удалил этот атрибут, и он сработал. Я заменил свой фрагмент после отсоединения, чтобы обновить фрагмент, но мне действительно не нужно было заменять фрагмент, мне нужно было только отсоединить, прикрепить (вызывает фрагмент onCreateView) и зафиксировать. Если у вас есть аналогичная проблема, и вы должны передать данные в свой фрагмент, я предлагаю изменить, где вы храните данные из пакета фрагмента в некоторые поля в другом классе. Получите доступ к ним в onCreateView фрагмента. – Metallica

Смежные вопросы