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线程指令,那么重画就没有机会发生
换句话说,“无效”将不会更改其编号,直到图形有机会运行,并且由于在您请求编号之前,它没有机会运行,因此它不可能为您提供正确的编号。为了使其按预期运行,需要做以下几件事:
invalidate()
,以便它执行回调,让您知道如何添加矩形。c) 您可以实现一个侦听器,以便在TextView的大小更改时运行代码FuzzicalLogic谢谢,我实现了
OnLayoutChangeListener