Фрагменты воссоздаются при щелчке на элементе меню.

У меня есть действие с 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.

Вы создаете новые экземпляры каждый клик.

Сохраните ссылку на них, если хотите заменить на ту же, ИЛИ добавьте затем в 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);
}
Другие вопросы по тегам