片段在底部导航视图更改项目单击时重新创建



我有一个带有框架布局和底部导航视图的活动...我有 4 个片段(A、B、C、D)...问题是当我在单击菜单项加载片段 B 后从 A 切换到 B 时,片段 A 被破坏了......我在所有回调方法(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;
    }
}

想知道我在这里到底错过了什么......提前感谢

好吧,您没有将片段添加到后备堆栈中。

您每次单击都会创建新实例。

如果您想用相同的替换或添加然后添加到 fragmentransaction 的 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);
}

最新更新