Сохранить состояние фрагмента A при переходе от bottomNavigationView к фрагменту B - PullRequest
2 голосов
/ 26 марта 2020

Я новичок в Android, и я уже некоторое время борюсь с сохранением состояния фрагмента. Мое приложение имеет 5 опций в bottomNavigationView (я использую активность по умолчанию от Android). Во фрагменте А (фактически называемом «SearchFragment») у меня есть кнопка, и при нажатии она устанавливает некоторый текст в TextBox. Я хочу сохранить состояние этого фрагмента (с текстом там) при переходе к другому фрагменту и возвращению к фрагменту A (и текст, оставшийся там с предыдущего нажатия кнопки).

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

Как я могу изменить код? Или есть другой способ сохранить текущее состояние фрагмента при навигации? Мне действительно нужна помощь ... и спасибо за ваше внимание!

Мой mainActivity выглядит следующим образом:

    public class MainActivity extends AppCompatActivity {

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

            BottomNavigationView navView = findViewById(R.id.nav_view);
            // Passing each menu ID as a set of Ids because each
            // menu should be considered as top level destinations.

            AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                    R.id.navigation_search, R.id.navigation_explore, R.id.navigation_trips, R.id.navigation_groups,R.id.navigation_profile)
                    .build();

            NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
            NavigationUI.setupWithNavController(navView, navController);
        }

    }

И класс фрагмента выглядит следующим образом:


    public class SearchFragment extends Fragment {

        private SearchViewModel searchViewModel;
        Button b;
        TextView text;
        Bundle savedState = null;

        public View onCreateView(@NonNull LayoutInflater inflater,
                                 ViewGroup container, Bundle savedInstanceState) {

            View root = inflater.inflate(R.layout.fragment_search, container, false);

            searchViewModel = ViewModelProviders.of(this).get(SearchViewModel.class);
            final TextView textView = root.findViewById(R.id.text_dashboard);
            searchViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
                @Override
                public void onChanged(@Nullable String s) {
                    textView.setText(s);
                }
            });
            Log.i("state","onCreate");
            Log.i("bundleIsNull", "" + (savedState == null));


            b  = root.findViewById(R.id.button2);
            text = root.findViewById(R.id.textView);


            b.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    text.setText("YEEEY");
                    Log.i("bundleIsNull", "" + (savedState == null));
                }
            });


            if(savedInstanceState != null && savedState == null) {
                savedState = savedInstanceState.getBundle("buttonText");
            }
            if(savedState != null) {
                text.setText(savedState.getCharSequence("buttonText"));
            }
            savedState = null;

            return root;
        }


        @Override
        public void onDestroyView() {
            super.onDestroyView();
            Log.i("state", "onDestroyView");
           savedState = saveState();
           text = null;
           b = null;
        }

        private Bundle saveState() {
            Bundle state = new Bundle();
            state.putCharSequence("buttonText", text.getText());
            return state;
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            Log.i("state", "onSaveInstanceState");
            outState.putBundle("buttonText", (savedState != null)? savedState : saveState());
        }

        @Override
        public void onPause() {
            super.onPause();
            Log.i("state","onPause");
        }
    }

1 Ответ

0 голосов
/ 27 марта 2020

Немного фактов вокруг Android Компонент навигации с нижней панелью навигации.

-> Фрагменты всегда воссоздаются (onCreate, onViewCreated, onViewDestroyed вызываются, как только пользователь переходит к другому фрагменту)

-> Фрагмент будет сохранен его состояние только при воссоздании активности (например, поворот экрана), перемещение между фрагментами не сохраняет состояние фрагмента.

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

Это невозможно, поскольку новый экземпляр FragmentA создается, когда вы перейдите назад от фрагмента B к фрагменту A.

вы не можете достичь этого с помощью контроллера навигации на данный момент.

Поскольку вы используете компонент навигации , вам следует перейти на использование Viewmodel для решения проблемы сохранения состояния фрагмента.

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

https://androidwave.com/fragment-communication-using-viewmodel/

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