调整大小后布局视图

时间:2012-10-13 12:21:08

标签: android hierarchyviewer

我正在创建一个显示经常更改的值的网格。因此,我使用的TextView在其内容发生变化时自动调整(Auto Scale TextView Text to Fit within Bounds)。调整大小发生,但视图布局不正确

layout after resize

问题是,当我使用HierarchyViewer 检查活动时,布局会显示为我想要的。

layout after hierarchyviewer

我的猜测是HierarchyViewer在视图上调用requestLayout()或invalidate(),但我已经尝试过但没有成功。此代码在主活动中调用,但不起作用。

new Handler().postDelayed(new Runnable() {            
            @Override
            public void run() {
              getWindow().getDecorView().requestLayout();
              getWindow().getDecorView().invalidate();
            }
          }, 5000);

我还尝试在调整大小后使视图无效。

TextView将重力设置为中心,如果没有进行调整,则看起来没问题。

欢迎任何提示,提前谢谢!

3 个答案:

答案 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线程中运行计时器代码。