我正在创建一个显示经常更改的值的网格。因此,我使用的TextView在其内容发生变化时自动调整(Auto Scale TextView Text to Fit within Bounds)。调整大小发生,但视图布局不正确
问题是,当我使用HierarchyViewer 检查活动时,布局会显示为我想要的。
我的猜测是HierarchyViewer在视图上调用requestLayout()或invalidate(),但我已经尝试过但没有成功。此代码在主活动中调用,但不起作用。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getWindow().getDecorView().requestLayout();
getWindow().getDecorView().invalidate();
}
}, 5000);
我还尝试在调整大小后使视图无效。
TextView将重力设置为中心,如果没有进行调整,则看起来没问题。
欢迎任何提示,提前谢谢!
答案 0 :(得分:2)
我通过在TextView的一个父级中覆盖onLayout并使用在构造函数中创建的Handler来解决它
public class CellView extends LinearLayout{
public CellView(Context context) {
super(context);
mHandler = new Handler();
View.inflate(context, R.layout.cellview, this);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if(changed){
mHandler.post(new Runnable() {
@Override
public void run() {
requestLayout();
}
});
}
super.onLayout(changed, left, top, right, bottom);
}
我曾尝试在TextView的onLayout中调用requestLayout,但它没有用,我不知道为什么。可能是因为该值是通过Observer更新的,但onTextChanged侦听器应该在UI Thread中发生。我希望它为别人服务
答案 1 :(得分:2)
requestLayout()
的工作方式是,当在视图上调用时,它将调度自身及其所有子项的布局传递。每当视图移位或调整大小时,对边距,填充或内容更改都是如此。
关于方法getDecorView()
的文档不清楚它究竟给你什么。但是,根据website上的文档:
请注意,第一次调用此函数会“锁定”各种窗口特征,如setContentView(View,android.view.ViewGroup.LayoutParams)中所述。
这让我相信getDecorView()
检索的视图有一些特别之处。您可能正在做的是使视图的布局永久化,从而在进行requestLayout()
传递时不会改变。
This is apparently the proper way to get the root view of your entire activity.
但是,出于效率原因,我建议您尽可能在最低的孩子身上调用requestLayout()
。就像我之前说的那样,它会在视图上调度布局传递,并且它是子视图。如果您在最顶层的视图中进行布局传递,那么您将重新构建包含所有视图的所有内容。
答案 2 :(得分:0)
您可能需要使用runOnUiThread按照here的说明在UI线程中运行计时器代码。