【问题标题】:Fragment visible behind last fragment and goes on片段在最后一个片段后面可见并继续
【发布时间】:2015-09-22 16:08:39
【问题描述】:

在 Activity 中有导航抽屉并通过这些代码行更改片段

switch (menuItem.getItemId()) {
case R.id.home:
    menuItem.setChecked(true);
    drawerLayout.closeDrawer(GravityCompat.START);
    if (getSupportFragmentManager().findFragmentByTag("ranking") == null) {
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.list_view_container, new HomeFragment(),
                        "ranking")
                .addToBackStack("ranking")
                .setTransition(
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit();
    } else {
        getSupportFragmentManager().popBackStack("ranking", 0);
    }
    return true;
case R.id.current_event:
    menuItem.setChecked(true);
    drawerLayout.closeDrawer(GravityCompat.START);
    if (getSupportFragmentManager().findFragmentByTag("ranking1") == null) {
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.list_view_container, new CurrentEvents(),
                        "ranking1")
                .addToBackStack("ranking1")
                .setTransition(
                        FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit();
    } else {
        getSupportFragmentManager().popBackStack("ranking1", 1);
    }
    return true;
}

我希望 Fragment 保留在内存中,这样它就不会一次又一次地重建并一次又一次地从 Internet 获取数据,所以我已经使用上述方法来获取它,但是现在,当我通过导航抽屉一个更改片段时片段正在替换另一个片段并继续,我还必须按返回按钮=创建新片段以退出应用程序的次数。我想要 Backstack 中的片段,但不是像这样互相替换的片段。我一次只想要一种方法。请帮忙

【问题讨论】:

    标签: java android android-fragments navigation-drawer


    【解决方案1】:

    由于您使用的是add(),因此之前的Fragment 不会从容器中删除。

    您应该将对add() 的调用替换为replace()。例如,case R.id.home 将变为:

    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.list_view_container, new HomeFragment(),
                "ranking")
        .addToBackStack("ranking")
        .setTransition(
                FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .commit();
    

    我希望 Fragment 保留在内存中,这样它就不会一次又一次地重建并一次又一次地从互联网上获取数据

    您可以尝试FragmentsetRetainInstance(true) 这样做,但不建议这样做(而且我从未使用过)。

    另一种更合适的方式是使用FragmentonSaveInstanceState()。你可以在Developer Android阅读它。

    【讨论】:

      【解决方案2】:

      你可以检查这个场景,希望它能解决你的问题:-

      尝试从 FragmentTransaction 附加和分离 Fragment。什么时候 你移动到下一个片段分离最后一个片段 FragmentTransaction ,当您想再次使用它时,请附加它。

      查看示例代码了解如何分离和附加片段,它将 帮助你:

      android.support.v4.app.FragmentManager fm =   getSupportFragmentManager();
                      AndroidFragment androidFragment = (AndroidFragment) fm.findFragmentByTag("android");
                      AppleFragment appleFragment = (AppleFragment) fm.findFragmentByTag("apple");
                      android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
      
                      /** Detaches the androidfragment if exists */
                      if(androidFragment!=null)
                          ft.detach(androidFragment);
      
                      /** Detaches the applefragment if exists */
                      if(appleFragment!=null)
                          ft.detach(appleFragment);
      
                      /** If current tab is android */
                      if(tabId.equalsIgnoreCase("android")){
      
                          if(androidFragment==null){
                              /** Create AndroidFragment and adding to fragmenttransaction */
                              ft.add(R.id.realtabcontent,new AndroidFragment(), "android");
                          }else{
                              /** Bring to the front, if already exists in the fragmenttransaction */
                              ft.attach(androidFragment);
                          }
      
                      }else{    /** If current tab is apple */
                          if(appleFragment==null){
                              /** Create AppleFragment and adding to fragmenttransaction */
                              ft.add(R.id.realtabcontent,new AppleFragment(), "apple");
                           }else{
                              /** Bring to the front, if already exists in the fragmenttransaction */
                              ft.attach(appleFragment);
                          }
                      }
                      ft.commit();
      
       `For Reference see this onTabChanged :` [http://wptrafficanalyzer.in/blog/creating-navigation-tabs-using-tabhost-and-fragments-in-android/][1]
      

      【讨论】:

        猜你喜欢
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多