#java #android #android-fragments
#java #Android #android-фрагменты
Вопрос:
Я пытаюсь разрешить пользователю переходить к новому Fragment
при нажатии на элемент списка. Все в порядке. Я создал интерфейс, который позволяет мне обрабатывать события щелчка из моегоFragmentA.java класс. Фрагмент прикрепляется к моей активности при запуске активности. моя активность расширяется FragmentActivity
.
В моем классе activity:
@Override
protected void onCreate(Bundle savedInsantaceState){
//...
getSupportFragmentManager().beginTransaction().replace(R.id.container, FragmentA.newInstance(param1, param2)).commit();
}
А затем в FragmentA.java я установил это в свой адаптер RecyclerView в качестве обработчика щелчков. Я использую метод add() вместо метода replace() Для изменения фрагмента, потому что я хочу сохранить состояние фрагмента (например, позицию RecyclerView и т.д.) При подключении FragmentB.
private void setListeners(){
mAdapter.setOnItemClickListener(itemClickListener);
}
private ItemListAdapter.ItemClickListener itemClickListener = new ItemListAdapter.ItemClickListener() {
@Override
public void onItemClicked(View v, ItemModel item) {
FragmentManager manager =((FragmentActivity)mActivity).getSupportFragmentManager();
manager.beginTransaction().add(R.id.post_activity_layout_container, FragmentB.newInstance(item, param2, param3)).addToBackStack("comment").commit();
}
};
ВОТ ПРОБЛЕМА: в этом случае FragmentA запущена, но невидима, в то время как пользователь видит FragmentB. Пользователь может просматривать фрагменты, и это вызывает проблемы. Я хочу сохранить последнее состояние FragmentA, но пользователь не должен нажимать на просмотры FragmentA из FragmentB. Как решить эту проблему? Есть ли лучшая практика для сохранения последнего состояния?
РЕДАКТИРОВАТЬ фрагмент содержит некоторую сортировку, фильтрацию. Когда я использую метод replace(), все фильтры, установленные пользователем, становятся недействительными, а также позиция RecyclerView становится равной 0. Представьте, что пользователь просматривает (например) 33. элемент в списке, нажимает на него, прикрепляется FragmentB, затем возвращается к FragmentA. Я хочу, чтобы пользователь продолжил с 33. item, не хочу, чтобы пользователь пытался найти, где он был.
Комментарии:
1. Попробуйте использовать ViewPager.
Ответ №1:
Я не уверен, что вы подразумеваете под «Я хочу сохранить последнее состояние фрагмента», но, AFAIK, тот факт, что вы заменяете фрагменты в контейнере, не означает, что они теряют состояние. Например, вы все еще можете нажать кнопку «Назад», и это вернет транзакцию, извлекая предыдущий фрагмент из обратного стека.
Редактировать: эффекты, которые вы наблюдаете, скорее всего, вызваны уничтожением и воссозданием иерархии представлений фрагмента. Вокруг этого есть несколько подходов. Первым было бы сохранить состояние пользовательского интерфейса и восстановить его после повторной инициализации фрагмента. К сожалению, это может быть сложно с позицией RecyclerView (вы можете погуглить это). Другой более простой подход (который является взломом) заключается в создании корневого представления в onCreateView
только один раз, сохранении ссылки на него внутри фрагмента и возврате того же представления при последующих вызовах onCreateView
. Если вы решите использовать более поздний подход, будьте осторожны, потому что вы будете использовать фрагменты не совсем так, как предполагалось использовать.
Не имеет прямого отношения к вашему вопросу, но я настоятельно рекомендую избегать ручного управления фрагментами. Это будет слишком болезненно. Вы можете использовать официальный навигационный компонент или, альтернативно, более простое решение, такое как библиотека FragNav. Я написал этот пост о более позднем, и это может вам помочь.
Комментарии:
1. Как предложил @Vasiliy, вы можете использовать компоненты навигации. Или вы можете сослаться на этот пост bog .
2. Василий, я отредактировал вопрос. Я попытался объяснить, что я имел в виду, говоря «я хочу сохранить последнее состояние фрагмента».