0

当用户单击我的主视图上的按钮时,我会膨胀一个新视图并将其添加到我的主视图中。我的新视图包含一个默认文本为“HelloWorld”的 TextView,同时在我的 textview 上设置我 setText("You have just come from...") 和 getLeft() 和 getRight() 的视图。问题是,它返回的坐标好像文本仍然是“HelloWorld”。

我认为它可能正在这样做,因为尚未绘制更新的文本。但是,如果我在这个新视图中单击一个按钮并在 onClick 中执行 getLeft() 和 getRight(),它会正常工作。我究竟做错了什么?

4

2 回答 2

1

我认为你可以为你的视图创建一个类,然后覆盖View.onFinishInflate并在那里做你的事情。

应该是一个非常短的类,只有这个方法被覆盖。

或者,您可以使用此处建议的解决方案:ViewGroup finish inflate event 但缺点是每次重做或更新布局时都会被回调,而不仅仅是在膨胀之后。

于 2012-06-16T18:58:27.797 回答
-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

于 2012-06-16T20:16:22.317 回答