Фрагменты воссоздаются при щелчке на элементе меню.
У меня есть действие с Framelayout и BottomNavigationView... У меня есть 4 фрагмента (A,B,C,D)... Дело в том, когда я переключаюсь с A на B после нажатия на элемент меню, чтобы загрузить фрагмент B, фрагмент A уничтожается... Я добавил сообщение Log во все методы обратного вызова (OnAttach, OnCreate, OnCreateView..... и т. д.), участвующие в жизненном цикле фрагмента, и onDestroyView ВСЕГДА вызывается при изменении фрагментов... Поэтому, когда я прихожу вернуться к ранее открытому фрагменту, снова вызывается onCreateView..
Вот мой класс деятельности:
public class Home extends AppCompatActivity
{
private BottomNavigationView.OnNavigationItemSelectedListener
mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{
Fragment fragment = null;
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
switch (item.getItemId())
{
case R.id.navigation_a:
if (!(currentFragment instanceof FragmentA))
fragment = FragmentA.newInstance();
break;
case R.id.navigation_b:
if (!(currentFragment instanceof FragmentB))
fragment = FragmentB.newInstance();
break;
case R.id.navigation_c:
if (!(currentFragment instanceof FragmentC))
fragment = FragmentC.newInstance();
break;
case R.id.navigation_d:
if (!(currentFragment instanceof FragmentD))
fragment = FragmentD.newInstance();
break;
}
if (fragment != null) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
return true;
}
return false;
}
};
//TODO Handle life-cycle methods when switching between fragments
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.add(R.id.fragment_container, FragementA.newInstance())
.commit();
fm.popBackStack();
BottomNavigationView navigation = findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
moveTaskToBack(true);
return true;
}
return false;
}
}
Я хотел бы знать, что мне здесь не хватает на самом деле.... Заранее спасибо
3 ответа
Вы создаете новые экземпляры каждый клик.
Сохраните ссылку на них, если хотите заменить на ту же, ИЛИ добавьте затем в backstack фрагмента транзакции, но вам понадобятся теги для навигации по предыдущим.
Попробуйте использовать setRetainInstance (true); для ваших фрагментов.
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}