【问题标题】:Fragment Transaction load empty view but fragment is shown after rotating device片段事务加载空视图,但旋转设备后显示片段
【发布时间】:2014-10-24 20:25:33
【问题描述】:

我正在按照谷歌文档的设计构建一个导航抽屉,但是我有一个片段没有被替换的问题。 http://developer.android.com/training/implementing-navigation/nav-drawer.html

当应用首次加载时,会加载默认片段。 单击抽屉列表中的另一个项目会留下一个空视图 但是在旋转设备时,会加载所选的片段。

public void selectNavActivty(int position){
    // TODO Changing between the different screens selection
    fragment = null;
    switch (position) {
        case 0:
            fragment = OverLay.newInstance();
            break;
        case 1: 
            fragment = Dummy.newInstance();
            break;
        }

    if(fragment != null) {
        // attach added to handle viewpager fragments
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.replace(R.id.content_frame, fragment).attach(fragment)
            .addToBackStack(null);

        trans.commit();
        getFragmentManager().executePendingTransactions();
    } else {
        Log.d("Drawer Activity","Error in creating Fragment");
    }
}

【问题讨论】:

  • 我有同样的问题。这并不常见。它在 20 次尝试中发生 1 次。 onActivityCreated 已创建,视图可以为空白或部分视图可以为空白...我添加而不是替换。
  • @apmartin1991 您可以在此处的某处提供您的代码 sn-ps(例如,作为 gist.github.com) - 更容易理解根本原因吗? (例如,在原始帖子中,调用了 .attach(),但不应该也没有必要调用 executePendingTransactions(),但我们对您的问题一无所知。
  • Konstantin Loginov - 这是我关于同一件事的问题stackoverflow.com/questions/34742360/…
  • @apmartin1991 我已经回答过了。我认为是由于使用executePendingTransactions 并在现有片段之上添加片段引起的,这通常是不好的做法,因为它们都保留在内存中并处于活动状态。

标签: android navigation-drawer fragmenttransaction


【解决方案1】:

对于导航菜单片段事务我使用以下方法,这样片段将被添加并放置在顶部。

String name = "myFragment";
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment, name)
.commit();

查找 attach() 函数。它遵循不同的片段生命周期。 还要确保你的布局文件 framelayout 是可见的。

【讨论】:

    【解决方案2】:

    修改你的代码如下:

    if(fragment != null) {
            // attach added to handle viewpager fragments
            FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
            trans.replace(R.id.content_frame, fragment);
            trans.addToBackStack(null);
            trans.commit();
        } else {
            Log.d("Drawer Activity","Error in creating Fragment");
        }
    

    如果解决方案不适合您,请将 xml 代码与您的片段代码一起共享。

    【讨论】:

    • 不就是复制粘贴@Veedka 的答案吗?
    【解决方案3】:

    添加 Fragment 后,它将被添加到活动状态及其视图中 将被添加到定义的容器视图中。但是通过附加任何东西都不会 如果片段尚未添加到 UI,则显示。它只是附加 到片段管理器。但是,如果视图已经添加到容器中 在 UI 中并在此之后分离,通过附加它将再次显示 在它的容器中。最后,如果您愿意,可以使用附加和分离 暂时销毁fragment View,想要展示和构建它的 在不丢失其内部活动状态的情况下查看未来。

    https://stackoverflow.com/a/18979024/3329488

    【讨论】:

      【解决方案4】:

      我的解决方案是在片段替换时用唯一标签标记所有片段。 确保在默认片段创建过程中也为其分配一个唯一标签。一种更有效的方法是在重新创建相同的片段之前识别片段。

      public void selectNavActivty(int position){
      // TODO Changing between the different screens selection
      
          FragmentManager fragmentManager = getSupportFragmentManager();
          fragment = fragmentManager.findFragmentById(R.id.content_frame);
          String fragmentTag = null;
          switch (position) {
              case 0:
                  fragmentTag = "case0Tag"; // please change to better tag name
                  break;
              case 1: 
                  fragmentTag = "case1Tag"; // please change to better tag name
                  break;
              default:
                  Log.d("Drawer Activity","Error in creating Fragment");
                  return;
          }
          if (fragmentTag != null && !fragment.getTag().equals(fragmentTag))
          fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit();
      }
      

      【讨论】:

        【解决方案5】:

        在我的情况下,旋转设备后会显示一个空白片段。我知道在Activity.onCreate() 中,我总是调用创建一个空白Fragment,然后再创建一个需要的。所以我把它的行为改成这样:

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
        
            if (savedInstanceState == null) {
                openEmptyFragment()
                openAnotherFragment()
            }
        }
        

        我建议在添加新片段之前检查savedInstanceState != null,如Why won't Fragment retain state when screen is rotated?中所述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-14
          相关资源
          最近更新 更多