我有一个常规按钮,我想在其上显示计时器。因此,想象一下按钮的文本每秒都会变化,就像倒计时器一样。但是,我需要这个计时器仅在按钮完全渲染并准备好在屏幕上显示时启动。
现在我正在片段的
AsyncTask
中启动计时器(这是一个 onCreateView()
)。这不是那么准确,因为我做了一些我必须做的其他加载工作。我可以将计时器从 onCreateView()
的底部开始移动,但即使这样也不是很准确。
我看到有一个
OnGlobalLayoutListener
树观察者。但我想象这是当整个视图树“即将”绘制时?我如何准确知道我的特定按钮何时呈现并对用户可见?
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);
}
});
您可以创建一个自定义按钮,然后实现 onFinishInflate() 或者在初始化自定义按钮时,将其可见性设置为不可见并实现 onWindowVisibilityChanged(int)。然后,当您将按钮设置为可见时,您将启动计时器。您也可以将其设置为启动按钮,按下该按钮即可启动计时器并更改计时器按钮所需的行为。
http://developer.android.com/reference/android/view/View.html