刷新或强制重绘片段

ps2*_*010 44 android android-fragments

我有一个片段,膨胀xml布局.我的要求是在恢复活动时更新片段内所有视图的文本大小.我试过了

    fragment.getView().invalidate();
Run Code Online (Sandbox Code Playgroud)

这似乎没有做的工作.我也试过了

    fragment.getView().requestLayout();
Run Code Online (Sandbox Code Playgroud)

这也没用.

在另一个活动中,我有一个ListFragment需要做同样的事情.我试过了

    listfragment.getListView().invalidate();
Run Code Online (Sandbox Code Playgroud)

这样做了,刷新我的列表视图并重新绘制其中的所有项目.

我不明白为什么一个有效而另一个无效.

我也看到人们建议启动片段事务并用新的片段替换当前片段,这让我感到疑惑

  1. 当我需要的是刷新我的片段包含的视图上的文本时,为什么要创建一个全新的片段并替换当前片段.

  2. 片段事务方法将阻止我在我的活动的布局xml中定义我的片段,我将不得不以编程方式将片段插入到正确的位置.

这有什么简单的方法吗?

Jac*_*ień 26

我认为没有办法解决这个问题.该片段在onCreateView()上重建它的UI ...但是在创建或重新创建片段时会发生这种情况.

您必须实现自己的updateUI方法,或者您将指定哪些元素以及它们应如何更新.这是一个很好的做法,因为无论如何你都需要在创建片段时这样做.

但是,如果这还不够,你可以做一些事情,比如用同一个片段替换片段强制它调用 onCreateView()

FragmentTransaction tr = getFragmentManager().beginTransaction();
tr.replace(R.id.your_fragment_container, yourFragmentInstance);
tr.commit()
Run Code Online (Sandbox Code Playgroud)

注意

要刷新ListView,您需要调用notifyDataSetChanged()ListView的适配器.


小智 23

在我的情况下,detachattach为我工作.

 getSupportFragmentManager()
                .beginTransaction()
                .detach(contentFragment)
                .attach(contentFragment)
                .commit();
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案会损害我的后卫 (12认同)

Vis*_*nav 7

使用以下代码再次刷新片段:

FragmentTransaction ftr = getFragmentManager().beginTransaction();                          
ftr.detach(EnterYourFragmentName.this).attach(EnterYourFragmentName.this).commit();
Run Code Online (Sandbox Code Playgroud)


小智 5

detach().detach()在支持库更新25.1.0(可能更早)之后无法正常工作。此解决方案在更新后效果很好:

getSupportFragmentManager()
    .beginTransaction()
    .detach(oldFragment)
    .commitNowAllowingStateLoss();

getSupportFragmentManager()
    .beginTransaction()
    .attach(oldFragment)
    .commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)