如何判断何时绘制了一个膨胀的视图?

时间:2012-06-16 18:52:31

标签: android

当用户点击主视图上的按钮时,我会为新视图充气并将其添加到我的主视图中。我的新视图包含一个TextView,其默认文本为" HelloWorld",同时设置视图我setText("你刚刚来自......")和我的getLeft()和我的textview上的getRight()。问题是,它返回的坐标好像文本仍然是" HelloWorld"。

我认为这可能是因为更新后的文字还没有被绘制出来。但是如果我在这个新视图中单击一个按钮并在onClick中执行getLeft()和getRight(),它就能正常工作。我做错了什么?

2 个答案:

答案 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