【问题标题】:Android - How to tell when a specific view has been rendered?Android - 如何判断何时呈现特定视图?
【发布时间】:2014-03-10 22:06:39
【问题描述】:

我有一个常规按钮,我想在其上显示计时器。因此,将按钮的文本想象为倒数计时器每秒都会发生变化。但是,我需要此计时器仅在按钮完全呈现并准备好在屏幕上显示时启动。

现在我正在片段的onCreateView() 中启动计时器(这是一个AsyncTask)。这不是那么准确,因为我做了一些我必须拥有的其他加载工作。我可能会在onCreateView() 的底部移动计时器开始,但即使这样也不是很准确。

我看到有一个OnGlobalLayoutListener 树观察者。但我想这是当整个视图树“即将”绘制时?我如何确切知道我的特定按钮何时呈现并对用户可见?

【问题讨论】:

  • 当我读到Callback method to be invoked when the global layout state or the visibility of views within the view tree changes这句话时,我不想做太多的假设。什么能见度?任何视图的可见性变化都会触发这个吗?我怎么知道是哪一个?这是准确的吗? ...等

标签: android android-view android-lifecycle


【解决方案1】:

OnGlobalLayoutListener() 是正确的去处。保证在您的按钮布局后(“完全渲染并准备好在屏幕上显示”)调用它。例如,在onCreate() 你可以这样做:

btn = (Button) findViewById(R.id.bn);   
btn.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        new AsyncTaskTimer.execute();
        // prevent the listener to be called more than once
        btn.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

【讨论】:

  • 这似乎是我想要的。我将不得不对其进行测试,然后如果它有效则接受它。谢谢!
【解决方案2】:

您可以创建一个自定义按钮,然后实现 onFinishInflate(),或者在初始化自定义按钮时,将其可见性设置为不可见并实现 onWindowVisibilityChanged(int)。然后,当您将按钮设置为可见时,您将启动计时器。你也可以让它成为一个开始按钮,当按下它时会启动计时器并改变作为计时器按钮所需的行为。

http://developer.android.com/reference/android/view/View.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多