#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" />