当用户点击主视图上的按钮时,我会为新视图充气并将其添加到我的主视图中。我的新视图包含一个TextView,其默认文本为" HelloWorld",同时设置视图我setText("你刚刚来自......")和我的getLeft()和我的textview上的getRight()。问题是,它返回的坐标好像文本仍然是" HelloWorld"。
我认为这可能是因为更新后的文字还没有被绘制出来。但是如果我在这个新视图中单击一个按钮并在onClick中执行getLeft()和getRight(),它就能正常工作。我做错了什么?
答案 0 :(得分:1)
我认为你可以为你的观点创建一个类,然后覆盖View.onFinishInflate并在那里做你的东西。
应该是一个非常短的类,只有这个方法被覆盖。
或者,您可以使用此处建议的解决方案:ViewGroup finish inflate event 但缺点是,每次重新布局或更新布局时,不仅在充气后,您都会回来。
答案 1 :(得分:-1)
这是一种在不扩展或覆盖任何内容的情况下执行此操作的方法:
private static void runJustBeforeBeingDrawn(final View view, final Runnable runnable)
{
final ViewTreeObserver vto = view.getViewTreeObserver();
final OnPreDrawListener preDrawListener = new OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
runnable.run();
final ViewTreeObserver vto = view.getViewTreeObserver();
vto.removeOnPreDrawListener(this);
return true;
}
};
vto.addOnPreDrawListener(preDrawListener);
}
在runnable参数中,您可以获得更新的大小和位置以及您需要的所有其他内容。
或者,如果您愿意,可以使用addOnGlobalLayoutListener
代替addOnPreDrawListener
。
编辑:runJustBeforeBeingDrawn的替代方案:https://stackoverflow.com/a/28136027/878126