2012-10-13 55 views
7

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

layout after resize

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

layout after hierarchyviewer

我的猜测是,HierarchyViewer调用requestLayout()或无效()的观点,但我已经试过了,没有成功。在主要活动中调用此代码时不起作用。

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

我也试过在调整大小后使视图无效。

TextView将重力设置为中心,如果没有调整大小,它看起来没问题。

任何提示将受到欢迎,提前致谢!

+0

您是否尝试请求父视图而非装饰视图的布局? – DeeV

+0

不是装饰视图树的父节点吗?我读过,要求视图上的布局会导致其所有子项请求布局。无论如何,我会说我已经尝试过,因为我已经尝试了很多事情,但是当我尝试提出建议时,我会回报。在view.View中引用requestLayout文档,“当事情发生变化时调用它,这已经使这个视图的布局无效,这将安排视图树的布局传递。” – Maragues

+0

它确实存在,但我看不出您的代码有任何问题。 requestLayout()布局父视图,它是子视图,但是我只在直接由我的应用程序控制的视图上调用它,所以这只是一个想法。 – DeeV

回答

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); 
    } 

我已经打过电话requestLayout的TextView的onLayout内,寿也没有工作,我不知道为什么。这可能是因为该值是通过Observer更新的,但onTextChanged监听器应该发生在UI线程中。我希望它能为其他人服务

0

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

+0

假设他正在UI线程中创建Handler,它将在UI线程中运行。 – DeeV

+0

我稍后再检查一下(现在不在这个工作中)。我会说从UI线程外部运行该代码会导致异常,但我可能会在UI线程之外创建Handler。感谢(Narcís和DeeV)对 – Maragues

2

requestLayout()的工作方式是,当在视图上调用它时,它会为本身及其所有子节点安排布局传递。无论何时视图已移动或调整大小以适应边距,填充或内容更改,这都是可取的。

有关方法getDecorView()的文档不清楚它究竟给了您什么。然而,每对website文档:

需要注意的是不同的窗口特性调用这个函数的第一次“在锁定”为的setContentView(视图,android.view.ViewGroup.LayoutParams)描述。

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

This is apparently the proper way to get the root view of your entire activity.

然而,出于效率的考虑,我建议在最低的孩子,你可能可以在调用requestLayout()。就像我之前说过的,它在视图上安排布局传递,它是孩子们。如果您在最顶层的视图上进行布局传递,那么您将在所有包含视图的位置上进行重构。

+0

这个想法的感谢,感谢您的时间和对requestLayout的不错研究,我将把它保留为选定的答案,因为它解决了我的特定问题。如果将来用户为您投票,我会将其授予您 – Maragues