调整大小后布局视图

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

调整大小后的布局

事情是, 当我用HierarchyViewer检查活动时 ,布局显示为我想要的。

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

上一篇: Layout a view after resizing

下一篇: Where to put validations when following a DCI design?