Как определить, когда фрагмент виден пользователю

#android #android-fragments #android-lifecycle

#Android #android-фрагменты #android-жизненный цикл

Вопрос:

в моем приложении есть одно действие, называемое MainActivity.

MainActivity загружает 3 фрагмента, все они добавляются в задний стек. Первый из них открывается автоматически и является ListFragment . Если я нажимаю на элемент в ListFragment, создается фрагмент DetailFragment. Внутри DetailF я могу нажать кнопку редактирования, и откроется EditFragment . Таким образом, backstack:

  • ListFragment
  • DetailFragment
  • EditFragment

Внутри EditF можно изменить информацию об объекте, который отображается в DetailFragment. Внутри onPause EditF я сохраняю изменения

 @Override
public void onPause() {
    super.onPause();        
    mTask.setTitle(mTitleEditText.getText().toString());
    mTask.setSummary(mSummaryEditText.getText().toString());

}
 

Поэтому, когда я нажимаю кнопку «Назад», изменения успешно сохраняются (я вижу это из журналов). Итак, появляется DetailF, но изменения не отображаются: это потому, что DetailF был ранее загружен с начальными данными. Поскольку onresume не вызывается, когда DetailF виден, я не могу указать фрагменту обновить данные.

Если я нажму кнопку «Назад» в другой раз, я вернусь к списку, и обновленные данные также не отображаются.

Вот как я создаю фрагменты:

в MainActivity.java

 private void launchListFragment(){

    getSupportFragmentManager().popBackStack ("detail", FragmentManager.POP_BACK_STACK_INCLUSIVE);

    Fragment newDetail = ListFragment.newInstance();
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment_container, newDetail, "LIST_F_TAG")
            .commit();
}
 

в ListFragment:

 Task taskToSend = mViewAdapter.getList().get(adapterPosition);

        if(getActivity() != null){
            Fragment newDetail = DetailFragment.newInstance(taskToSend);
            getActivity().getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, newDetail)
                    .addToBackStack("detail")
                    .commit();
        }
 

в подробностиfragment:

 private void launchEditFragment(Task task){
    if(getActivity() != null){
        Fragment newDetail = EditFragment.newInstance(task);
        getActivity().getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, newDetail)
                .addToBackStack("edit")
                .commit();
    }
}
 

Я хочу, чтобы после обновления данных mTask в EditFragment все остальные фрагменты отображали обновленные данные. Спасибо.

Комментарии:

1. Вы уверены onPause , что вызывается, а затем onResume не вызывается? Если я правильно понимаю, невозможно приостановить, а затем снова отобразить фрагмент без вызова onResume .

2. Фрагмент никогда не переходит в режим onPause или onResume, поскольку его жизненный цикл привязан к его активности. Поскольку действие управляет большим количеством фрагментов, но никогда не приостанавливается (за исключением закрытия приложения), тогда фрагмент всегда выполняется так, как если бы он был виден, даже если это не так.

3. Понятно, я думал, что фрагменты были приостановлены, когда они были скрыты, как действия. Вы управляете задним стеком или позволяете системе это делать?

4. Я только что решил проблему, переключившись на activities. Это гораздо менее проблематично, и я не хочу тратить время на повторное изобретение колеса, чтобы получить простую паузу при работе с фрагментом.