6

我正在创建一个显示经常变化的值的网格。因此,我使用了一个 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 的重力设置为中心,如果没有调整大小,它看起来没问题。

欢迎任何提示,在此先感谢!

4

3 回答 3

2

我通过在 TextView 的父级之一中覆盖 onLayout 并使用在构造函数中创建的处理程序来解决它

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,但它不起作用,我不知道为什么。这可能是因为值是通过观察者更新的,但 onTextChanged 侦听器应该发生在 UI 线程中。我希望它为别人服务

于 2012-10-15T19:58:05.773 回答
2

工作方式requestLayout()是,当在视图上调用时,它将在其自身及其所有子级上安排布局传递。每当视图对边距、填充或内容更改进行了移动或调整大小时,这都是可取的。

该方法的文档对于getDecorView()它到底给你什么不是很清楚。但是,根据网站上的文档:

请注意,第一次调用此函数会“锁定”各种窗口特征,如 setContentView(View, android.view.ViewGroup.LayoutParams) 中所述。

这让我相信getDecorView()检索的视图有一些特别之处。您可能正在做的是使视图的布局永久化,因此当您requestLayout()通过时永远不会改变。

这显然是获取整个活动的根视图的正确方法。

requestLayout()但是,出于效率原因,我建议您尽可能调用最低的孩子。就像我之前说的,它在一个视图和它的子视图上安排一个布局传递。如果您在最顶层的视图上进行布局传递,那么您实质上是在重建包括保留在原地的视图在内的所有内容。

于 2012-10-16T12:08:18.013 回答
0

您可能需要使用runOnUiThread在 UI 线程中运行计时器代码,如此所述。

于 2012-10-15T13:50:29.100 回答