Android 文本视图测量值,顶部、左侧和#x27;t正在更新

Android 文本视图测量值,顶部、左侧和#x27;t正在更新,android,Android,在过去的几个小时里,这让我发疯。 我有一个框架布局,上面有一个按钮。 当你点击这个按钮时,我想画一个新词,然后得到它的尺寸,这样我就可以在它周围画一个矩形 这是单击“下一步”按钮时运行的代码: private OnClickListener m_onClickNext = new OnClickListener() { public void onClick(View v) { TextView tv = new TextView(context);

在过去的几个小时里,这让我发疯。
我有一个框架布局,上面有一个按钮。 当你点击这个按钮时,我想画一个新词,然后得到它的尺寸,这样我就可以在它周围画一个矩形

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

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)
至少会更新宽度和高度

我尝试在
tv
m_frameLayout
上调用
invalidate
requestLayout
,但没有成功

我知道布局图还没画完。。但是为什么

我知道布局图还没画完。。但是,为什么

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

换句话说,“无效”将不会更改其编号,直到图形有机会运行,并且由于在您请求编号之前,它没有机会运行,因此它不可能为您提供正确的编号。为了使其按预期运行,需要做以下几件事:

  • 您必须允许绘制布局。这可以通过三种方式完成:a)你可以在不同的线程上运行你的点击,但这不能保证什么时候可以完成,只能保证它会完成。b) 您可以重写
    invalidate()
    ,以便它执行回调,让您知道如何添加矩形。c) 您可以实现一个侦听器,以便在TextView的大小更改时运行代码

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

  • 希望这有帮助


    FuzzicalLogic

    谢谢,我实现了
    OnLayoutChangeListener