Поведение FragmentTransaction add()

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

Фрагмент A имеет Button

Фрагмент B имеет TextView

Когда я добавляю фрагмент A, а затем добавляю фрагмент B, я могу щелкнуть фрагмент A Button, даже оставаясь на фрагменте точка зрения Б.

Я использую:

FragmentTransaction fragmentTransaction = 
            getSupportFragmentManager().beginTransaction().
            add(getRootViewContainer(),fragment,fragment.getClass().getSimpleName());

if (shouldGoBack) 
    fragmentTransaction.addToBackStack(fragment.getClass().getSimpleName());

где getRootViewContainer() возвращает id FrameLayout, который я использую в качестве основного контейнера своей активности.

Теперь, действительно ли это поведение по умолчанию для add()?

Если да, то есть ли способ избежать этого или просто нужно использовать replace()?


person vinitius    schedule 13.01.2015    source источник
comment
Вы уже нашли решение? Попробуйте некоторые ниже, если вы еще не сделали. Я уверен, что мой будет работать, потому что я использую его сам.   -  person Jordi Sipkens    schedule 13.01.2015


Ответы (3)


FragmentTransaction.hide(fragmentBehind); //works for me!

пример :

//I have it globally available
FragmentTransaction trans = MainActivity.getManager().beginTransaction(); 

//not globally 
FragmentTransaction trans = getFragmentManager().beginTransaction();
MapFragment newFragment = new newFragment();
trans.add(R.id.fragmentContainer, newFragment, tag);
trans.hide(this);
trans.addToBackStack(tag);
trans.commit();
person Jordi Sipkens    schedule 13.01.2015
comment
Привет, извините за задержку. Я использовал этот подход сокрытия и отображения фрагментов, но я хотел избежать этого, когда я должен показать одно или скрыть другое. Вы знаете какие-нибудь другие способы, которыми мы могли бы это сделать? Спасибо. - person vinitius; 13.01.2015
comment
Отключить фокус макета позади? Я действительно не знаю другого чистого способа. Этот метод лучше всего работает со мной, и я использую около 15 различных видов фрагментов. Если я захочу, у меня может быть более 100 фрагментов, но все идет хорошо из-за функции выше. - person Jordi Sipkens; 14.01.2015

Здесь вы можете просто скрыть предыдущий фрагмент во время транзакции текущего фрагмента.

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  Fragment newFragment= new MyFragment ();
  ft.hide(CurrentFragment.this);
  ft.show(newFragment);
  ft.commit();

Это сработало для меня, просто попробуйте.

person DeepakPanwar    schedule 13.01.2015

Да, это поведение add() по умолчанию. Если вы действительно не хотите, чтобы пользователь replace(), вы можете попытаться отключить представления, которые находятся внутри «старого» фрагмента.

person localhost    schedule 13.01.2015