Как сохранить состояние просмотра Android Recycle (положение прокрутки) в деятельности с двумя фрагментами - PullRequest
1 голос
/ 04 апреля 2019

Я новичок в Android и, в качестве первого шага, создаю приложение для работы в телефоне с заданием, в котором я помещаю два фрагмента.Первый фрагмент имеет переработанное представление элементов, которые должны представлять заголовки статей.Когда я нажимаю на один, открывается второй фрагмент и показывает заголовок (в текстовом представлении) и содержание (в другом текстовом представлении) статьи (на данный момент, для простоты, я помещаю заголовок статьи как поддельные заголовки, и яесть настройка, для которой содержимое не отображается, но в текстовом представлении содержимого также отображается заголовок).

Я хочу сохранить положение прокрутки представления рециркулятора.

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

1) когда я нажимаю кнопку возврата из пейзажа, возвращаясь к первому фрагменту, я получаю ту же настройку для вида рециркулятора, хорошо;

2), когда я снова поворачиваюсьс портретом, оставшимся на втором фрагменте, тоже нормально.Теперь, если я нажму кнопку «Назад», чтобы вернуться к первому фрагменту, к списку статей, представление рециркулятора НЕ будет настроено для запуска с элемента, на который я изначально прокрутился.Что я могу сделать?

У меня есть этот код в первом фрагменте, который содержит представление рециркулятора:

@Override
public void onSaveInstanceState(Bundle state) {
    int lastFirstVisiblePosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
    state.putInt(Articles.RECYCLER_POSITION_KEY, lastFirstVisiblePosition);

    super.onSaveInstanceState(state);
}

@Override
public void onActivityCreated(Bundle state) {
    super.onActivityCreated(state);

    if (state != null) {
        int lastFirstVisiblePosition = state.getInt(Articles.RECYCLER_POSITION_KEY);
        ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPosition(lastFirstVisiblePosition);
    }
}

Чего мне не хватает?Спасибо.

[ EDIT ] В моем слушателе это для вызова второго фрагмента:

ArticleReaderFrag newFragment = new ArticleReaderFrag();
Bundle args = new Bundle();
args.putString(NEW_FRAG_TITLE_KEY, item);
args.putString(NEW_FRAG_BODY_KEY, itemb);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.main_activity, newFragment);
transaction.addToBackStack(null);

transaction.commit();

1 Ответ

0 голосов
/ 04 апреля 2019

Повторное использование фрагмента

Когда действие запускается в первый раз, создайте новый экземпляр Fragment и используйте TAG, чтобы сохранить его с FragmentManager. Когда деятельность воссоздается после изменения ориентации. Восстановите старый экземпляр, используя тег.

Вот пример кода, который вы должны иметь в своей деятельности.

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_activity);
    fragmentManager = getSupportFragmentManager();

    if(savedInstanceState==null) {

        userFragment = UserNameFragment.newInstance();
        fragmentManager.beginTransaction().add(R.id.profile, userFragment, "TAG").commit();
    }
    else {
        userFragment = fragmentManager.findFragmentByTag("TAG");
    }

}

Как сохранить позицию прокрутки?

Это происходит по умолчанию. Прочитайте ответ для более подробной информации.

EDIT

Я верю, что это ваш метод

public createSecondFragment(int position){

     ArticleReaderFrag newFragment = new ArticleReaderFrag();
     Bundle args = new Bundle();
     args.putString(NEW_FRAG_TITLE_KEY, item);
     args.putString(NEW_FRAG_BODY_KEY, itemb);
     newFragment.setArguments(args);

     FragmentTransaction transaction = 
     getSupportFragmentManager().beginTransaction();

     transaction.replace(R.id.main_activity, newFragment);
     transaction.addToBackStack(null);

     transaction.commit();

}

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

@Override
protected void onCreate(Bundle savedInstanceState)
{
   super.onCreate(savedInstanceState);
   setContentView(R.layout.first_activity);

   if(savedInstanceState!=null) {

      int lastSavedPosition = // Your logic 
      createSecondFragment(lastSavedPosition )

   }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...