安卓:活动界面创建后调用的方法

9
我希望在活动的图形界面创建后执行某些任务。我需要知道一些视图的确切高度和宽度,并根据宽度和高度更改某些视图的layoutParams属性。 在onResume方法中,视图所有参数仍等于0 ...
目前,我使用延迟任务,在onCreate之后一段时间运行该任务,但这根本不是一个好的解决方案...
活动创建时调用的最后一个方法是什么?这样的方法中是否可用视图的宽度和高度?
5个回答

13

在 onCreate() 方法内调用此函数。

       final View rootView = getWindow().getDecorView().getRootView();
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {

                    @Override
                    public void onGlobalLayout() {

                        //by now all views will be displayed with correct values

                    }
                });

4

onResume()是最后一个被调用的方法,但更好的选择可能是onViewCreated()。它的优点是不会在每次重新获得焦点时都被调用。但请尝试在post()方法中获取您所需布局元素的属性,而不是直接获取视图。例如:

        textView.post(new Runnable() {
            @Override
            public void run() {
                 // do something with textView
            }
        });

谢谢,我会尝试两种方法!但是在您的意见中,为什么第二种方法比第一种更好呢? - aveschini
不,你应该在onViewCreated中使用我的代码。post()是必需的,因为“片段的视图层次结构此时尚未附加到其父级”。如果仍然无法返回正确的结果,则使用postDelayed()。这很不好,但简单有效。 - Malachiasz
这里有同样的问题:https://dev59.com/P2855IYBdhLWcg3w7o-g - Malachiasz
这并不完全相同,因为我需要根据其他布局中的参数修改某些视图的布局,这些视图甚至不是同一布局中的兄弟视图。 - aveschini
2
没有名为onViewCreated()的方法。有一个叫做onCreateView()的方法,但它是在视图被填充之前而不是之后调用的。 - Price
Activity没有onViewCreated方法,而Fragment有。 - Javier Delgado

1
活动开始时执行的最后一个方法是 onResume()。您可以在 Activity lifecycle 中找到它。
如果这还不够好,从这个 onResume() 运行延迟任务,你就会没问题了。

0

使用协程:

在onCreate()中...

CoroutineScope(SupervisorJob()).launch {
  getImageAttributes()
}

...然后使用while循环等待图像出现在视图中...

private fun getImageAttributes() {
  while (imageView.height == 0) { /* */ }
  val h = imageView.height
  val w = imageView.width
  val b = imageView.clipBounds
  val x = imageView.x
  val y = imageView.y
  val tx = imageView.translationX
  val ty = imageView.translationY
}

如果imageView的高度可能为0,您应该添加超时或使作业可取消。

0
在onResume()方法的最后一行获取你想要的所有数据。它应该会显示你所需的一切。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接