调整大小后布局视图
我正在创建一个显示频繁更改值的网格。 因此,我使用的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将重力设置为中心,如果没有调整大小,它看起来没问题。
任何提示都会受到欢迎,提前致谢!
我通过在其中一个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线程中。 我希望它能为别人服务
requestLayout()
工作方式是在视图上调用时,它会为其本身及其所有子级安排一个布局传递。 无论何时视图已移动或调整大小以适应边距,填充或内容更改,这都是可取的。
关于方法getDecorView()
的文档并不十分清楚它究竟给了你什么。 但是,根据网站上的文档:
请注意,第一次调用此函数会“锁定”各种窗口特性,如setContentView(View,android.view.ViewGroup.LayoutParams)中所述。
这让我相信getDecorView()
检索的视图有一些特殊之处。 你可能正在做的是使视图的布局永久性,因此在进行requestLayout()
传递时永远不会改变。
这显然是获取整个活动的根视图的正确方法。
但是,出于效率的原因,我建议在可能的最低的孩子上调用requestLayout()
。 就像我之前说过的,它在视图上安排布局传递,它是孩子们。 如果您在最顶层的视图上进行布局传递,那么您将在所有包含视图的位置上进行重构。
您可能需要使用runOnUiThread在UI线程中运行计时器代码,如此处所述。
链接地址: http://www.djcxy.com/p/64705.html