TextView测量,顶部,左侧未更新

时间:2012-01-13 20:52:19

标签: android

过去几个小时,这让我发疯了 我有一个FrameLayout,它上面有一个按钮。 当你点击按钮时,我想绘制一个新单词,并获得它的测量值,这样我就可以在它周围画一个矩形。

这是您点击“下一步”按钮时运行的代码:

private OnClickListener m_onClickNext = new OnClickListener()
{
    public void onClick(View v)
    {
        TextView tv = new TextView(context);                
        tv.setTextColor(0xFF000000);
        tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 100);                
        tv.setText("TEXTSTRING");

        m_frameLayout.addView(tv, new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER));

        //tv.measure(0, 0);
        int left = tv.getLeft();
        int top = tv.getTop();
        int right = left + tv.getMeasuredWidth();
        int bottom = top + tv.getMeasuredHeight();
    }
};

左和上是0(零)。
添加tv.measure(0, 0)至少会更新宽度和高度。

我尝试在invalidaterequestLayout上调用tvm_frameLayout,但没有成功。

我知道布局还没有完成绘图..但为什么????

1 个答案:

答案 0 :(得分:0)

  

我知道布局还没有完成绘图..但是,为什么????

布局未完成绘图的原因是因为您使用的是与UI绘图相同的线程。除非您使用AsyncTask或其他Thread指定其他线程,否则您所做的一切都是使用单个线程(UI线程)。 Invalidate()不是强制立即重绘的函数。 Invalidate()标记所有内容,以便当UI线程空闲时,它将重绘任何无效的内容。如果你继续给出UI线程指令,那么重绘就没有机会发生。

换句话说,在绘图有机会运行之前,Invalidate不会更改其数字,并且由于在您要求其编号之前没有机会运行,因此无法为您提供正确的数字。为了使这种行为符合要求,需要做一些事情:

  1. 您必须允许绘制布局。这可以通过三种方式完成:a)您可以在不同的线程上运行您的点击,但这并不能保证何时完成,只是它会。 b)您可以覆盖invalidate(),以便它执行回调以告知您添加矩形。 c)您可以实现一个监听器,以便在TextView的大小发生变化时运行代码。

  2. 重新绘制布局后,您可以应用特殊矩形。通过使用上面的方法c),您可以立即完成此操作。但是,您必须确保再次使()无效,从而导致处理中的潜在循环。因此,请确保有某种指示符告诉您已经绘制了矩形而不是第三次使()失效。

  3. 希望这有帮助,

    FuzzicalLogic