【发布时间】:2013-03-07 03:53:23
【问题描述】:
我有一个扩展 xml 布局的片段。我的要求是在我的活动恢复时更新片段内所有视图的文本大小。我试过了
fragment.getView().invalidate();
这似乎没有做这项工作。我也试过了
fragment.getView().requestLayout();
这也没用。
在另一个活动中,我有一个 ListFragment 需要做同样的事情。我试过了
listfragment.getListView().invalidate();
成功了,刷新了我的列表视图并重绘了其中的所有项目。
我不明白为什么一个有效,而另一个无效。
我还看到有人建议发起 片段事务 并用新片段替换当前片段,这让我感到疑惑
当我只需要刷新我的片段包含的视图上的文本时,我为什么要创建一个全新的片段并替换我当前的片段。
片段事务方法将阻止我在我的活动的布局 xml 中定义我的片段,我必须以编程方式将片段插入到正确的位置。
有什么简单的方法吗?
【问题讨论】:
-
更新
TextView之类的文本大小的已知属性不是您应该调用invalidate()的那种事情;当属性更改时,框架会为您执行此操作。也许显示您正在更新文本属性的代码;问题更可能存在。唯一需要手动invalidate()视图的情况是创建 Android 不知道的自定义属性。 -
片段负责在它包含的所有视图中加载数据,并且在填充该数据时,它正在检查用户从首选项设置的文本大小,当时它正在设置该大小。我相信如果大小发生显着变化,视图必须自行调整以包装内容,因此需要重绘。而且即使是自定义属性而不是文本大小,我们如何强制片段视图重绘自身?
-
再次,当您设置文本值时,视图/布局系统知道它需要重新测量和重新绘制。只需查看 TextView 源代码中的
setRawTextSize()(第 2406 行)...属性更新后会调用什么? android.googlesource.com/platform/frameworks/base/+/refs/heads/… 另外,顺便说一句,invalidate()不会强制视图自行调整,requestLayout()会这样做。 -
奇怪的是 requestLayout 在这种情况下对我不起作用。我现在明白你所说的关于更改文本大小的内容,但我想知道是否需要重新绘制片段视图,我将如何实现?
-
我遇到了同样的问题。根据这里未回答的问题的数量,我想知道我是否真的了解 View 元素应该如何工作。