сохранить фрагмент от уничтожения или скрытия и также изменить номер значка

#java #android #mysql #android-volley

#java #Android #mysql #android-volley

Вопрос:

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

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar;
    toolbar = (Toolbar) findViewById(R.id.my_nav_bar);

    toolbar.setTitleTextColor(getResources().getColor(R.color.text_white));
    setSupportActionBar(toolbar);


    navigationView = findViewById(R.id.mynavigation);
    drawerLayout = findViewById(R.id.mydrawer);
    actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open, R.string.close);
    drawerLayout.addDrawerListener(actionBarDrawerToggle);
    actionBarDrawerToggle.syncState();
    bottomNavigationView = findViewById(R.id.my_bottom_menu);
    badgeDrawable = bottomNavigationView.getOrCreateBadge(R.id.cart);

    badgeDrawable.setNumber(cartitems);


    bottomNavigationView.setSelectedItemId(R.id.home);


    fragmentManager.beginTransaction().replace(R.id.mycontainer, new home()).commit();
    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.home:

                    fragmentManager.beginTransaction().replace(R.id.mycontainer, new home()).addToBackStack(null).commit();
                    break;
                case R.id.order:

                    fragmentManager.beginTransaction().replace(R.id.mycontainer, new order()).addToBackStack(null).commit();
                    break;
                case R.id.cart:
                    fragmentManager.beginTransaction().replace(R.id.mycontainer, new Cart()).addToBackStack(null).commit();

                    break;

            }
            return true;
        }
    });
 

}

Ответ №1:

Согласно руководству по созданию фрагмента:

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

Итак, вам нужно обернуть все вызовы, которые устанавливают ваше начальное состояние в if (savedInstanceState == null) :

 if (savedInstanceState == null) {
    fragmentManager.beginTransaction().replace(R.id.mycontainer, new home()).commit();
}
 

Обратите внимание, что в том же руководстве также объясняется, как вы можете добавить свой исходный фрагмент с помощью XML, который делает то же самое для вас и позволяет полностью удалить его beginTransaction из вашего onCreate() :

 <androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/mycontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name=".home" />