【问题标题】:save fragment from getting destroyed or hiding and change badge number also保存片段以免被破坏或隐藏并更改徽章编号
【发布时间】:2021-03-14 02:40:26
【问题描述】:

我有一个主要活动,当我改变方向时,我已经加载了几个片段,当前片段被破坏并加载默认片段,我还想从片段中更改徽章编号,但我不知道如何做。请帮我保存片段的状态。

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;
        }
    });

}

【问题讨论】:

    标签: java android mysql android-volley


    【解决方案1】:

    根据Create a fragment guide

    请注意,片段事务仅在savedInstanceStatenull 时创建。这是为了确保在首次创建活动时只添加一次片段。当配置发生变化并重新创建activity时,savedInstanceState不再是null,并且不需要再次添加fragment,因为fragment会自动从savedInstanceState恢复。

    因此,您需要在if (savedInstanceState == null) 中包装任何设置初始状态的调用:

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

    请注意,同一指南还解释了如何使用 add your initial fragment via XML,它为您做同样的事情,并允许您从您的 onCreate() 中完全删除 beginTransaction

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 2021-03-14
      • 1970-01-01
      • 2013-03-09
      • 2012-02-02
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      相关资源
      最近更新 更多