【问题标题】:Android fragment replace(...) on thread线程上的Android片段替换(...)
【发布时间】:2016-08-15 22:58:09
【问题描述】:

谁能解释一下为什么在线程上替换片段有时会导致空白而不是在屏幕上显示片段?

public void swapFragment(final CustomFragment fragment) {

    new Thread(new Runnable() {
        @Override
        public void run() {
            FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container, fragment, fragment.getName());
            ft.addToBackStack(fragment.getName());

            ft.commit();
        }
    }).start();

}

让我解释一下发生了什么:

1) 我的容器内没有添加任何片段。

2) 我正在使用这种方法添加片段 A - 它的工作原理

3) 然后我使用这种方法将实际片段 A 与我的片段 B 交换 - 它的工作

4) 但是当我尝试将它与片段 A 的新实例 (!!!) 交换时,它会留下空白

我知道我可以在主线程上执行此操作,但这只是一个示例。我正在处理不同的问题,但我的问题更难以解释。

编辑:

在第 4 点)我放置了错误的片段 - 原来是“片段 A

【问题讨论】:

    标签: java android multithreading android-fragments


    【解决方案1】:

    您正在用它的新实例交换相同的片段 B

    交换操作仅在源和目标时有效 片段属于不同的类别。

    我可以推迟回答this 和问题this

    所以,解决方法是:

    1. 检查是否已经添加了相同的片段类(isAdded()),如果没有则使用swap(),否则使用remove()add() 操作

      public void swapFragment(final CustomFragment fragment) {
      
      new Thread(new Runnable() {
          @Override
          public void run() {
              FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
              if(!fragment.isAdded()) {
                  ft.replace(R.id.fragment_container, fragment, fragment.getName());
                  ft.addToBackStack(fragment.getName());
      
                  ft.commitAllowingStateLoss();
      
              } else {
                  ft.remove(R.id.fragment_container, fragment);
                  ft.add(fragment);
                  ft.addToBackStack(fragment.getName());
      
                  ft.commitAllowingStateLoss();
      
          }
      }).start();
      

      }

    2. 检查是否已经添加了相同的片段类 (isAdded()) 然后更新其 UI 内容,否则 swap()

      public void swapFragment(final CustomFragment fragment) {
      
      new Thread(new Runnable() {
          @Override
          public void run() {
               FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
              if(!fragment.isAdded()) {
                  ft.replace(R.id.fragment_container, fragment, fragment.getName());
                  ft.addToBackStack(fragment.getName());
      
                  ft.commitAllowingStateLoss();
              } else {
                  // logic to update UI of same instance
              }
          }
      }).start();
      

      }

    仍然等待这个问题的确切解决方案:)

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多