【问题标题】:Fragment data is going null when another fragment loaded加载另一个片段时,片段数据变为空
【发布时间】:2015-09-10 11:43:51
【问题描述】:

NavigationDrawer 我正在服用两个碎片。在每个片段中,我都有标签滑块。当我第一次单击时,两个片段中都有数据,但是当我从一个片段转到另一个片段时,两个片段中的数据都为空。我检查了片段的保存状态,但问题仍然没有解决。知道如何解决这个问题吗?

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if (navigationView != null) {
    setupDrawerContent(navigationView);
    mFragmentManager = getSupportFragmentManager();
    mFragmentTransaction = mFragmentManager.beginTransaction();
    mFragmentTransaction.replace(R.id.frame, new LoginFragment()).commit();
}

private void setupDrawerContent(NavigationView navigationView) {
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            System.out.println("Navigation Drawer Item Clciked ---->" + navDrawerClickedItem);
            Fragment fragment = null;
            switch (menuItem.getItemId()) {
                case R.id.roof:
                    if (navDrawerClickedItem == menuItem.getItemId()) {
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        System.out.println("New roof Fragment already loaded");
                    } else {
                        navDrawerClickedItem = menuItem.getItemId();
                        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.frame, new RoofTabFragment()).commit();
                        System.out.println("New roof Fragment Created");
                    }
                    break;
                case R.id.floor:
                    if (navDrawerClickedItem == menuItem.getItemId()) {
                        mDrawerLayout.closeDrawer(Gravity.LEFT);
                        System.out.println("Floor Fragment already loaded");
                    } else {
                        navDrawerClickedItem = menuItem.getItemId();
                        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.frame, new FloorTabFragment()).commit();
                        System.out.println("Floor Fragment Created");
                    }
                    break;
                case R.id.signOut:
                    LogMeOut();
                    break;
            }
            if (fragment != null) {
                mFragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
            } else {
                Log.e("MainActivity", "Error in creating fragment");
            }
            menuItem.setChecked(true);
            setTitle(menuItem.getTitle());
            mDrawerLayout.closeDrawers();
            return false;
        }
    });
}

【问题讨论】:

  • 能不能分享对应异常的logcat?
  • 尝试创建一个单例片段? :D
  • @darthvading 没有得到任何异常
  • 因为每次您在替换时创建片段的新实例,例如:fragmentTransaction.replace(R.id.frame, new RoofTabFragment())...所以保存片段的状态将不起作用。创建一个实例变量片段...使用适当的标签将其添加到 backstack 并从 backstack 中提取这些片段
  • @ShadowDroid !这是正确的方法吗? if (fragment != null) { System.out.println("not null"); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .add(R.id.frame, fragment).addToBackStack("") .remove(fragment) .commit(); }

标签: android android-fragments android-viewpager navigation-drawer


【解决方案1】:

通过将viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 中的getFragmentManager() 替换为getChildFragmentManager() 解决了问题。

【讨论】:

    【解决方案2】:

    嘿,我过去曾遇到过这样的问题,在这种情况下,我所做的就是在 Main ActivityFirst Activity 中创建一个静态字段并在那里获取所有数据并给它 settergetter 方法,数据将是静态的,可以通过应用程序访问,数据不会改变

    这样您的数据将与您的所有 片段 和预加载相同,并且数据也将是单例的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多