任何人都可以解释为什么isAttachedToWindow()
是false
而不是true
?我似乎有附件问题。
据我了解,setContentView(rl)
应将RelativeLayout
附加到窗口。我错过了什么?
public class TestActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final RelativeLayout rl = new RelativeLayout(this);
setContentView(rl);
boolean isAttached = rl.isAttachedToWindow();
}
}
答案 0 :(得分:1)
我的猜测是您不能依赖视图实际附加到onCreate()
中的窗口。您最好在isAttached()
onStart()
检查
根据onStart()
的文档:
void
onStart()
在
onCreate(Bundle)
之后或onRestart()
后调用 当活动停止时,但现在再次显示 给用户。随后是onResume()
。派生类必须 调用超类的这种方法的实现。如果 他们没有,会抛出异常。
因此,一旦调用start,就会向用户显示活动,这意味着可以安全地假设您的视图附加到窗口。相反,可能已调用onCreate()
,但活动可能尚未显示给用户 - 因此您的观看次数可能无法附加。
答案 1 :(得分:1)
当您执行与视图相关的操作时,该更改实际上不会立即执行,而是会在主线程的MessageQueue
上发布,之后这些消息将由Looper
下一个循环事件。
让我们举个具体的例子。想象一下,您的TextView
布局属性为wrap_content/wrap_content
。
TextView textView = ...;
textView.setText("some fancy text");
// Will print `0 0`, because this message hasn't yet beet "parsed" by `Looper`
// Changes will take effect on the next frame
Log.i("tag", textView.getWidth() + " " + textView.getHeight());
// Will print `some fancy text`, because this is just a plain Java object
Log.i("tag", textView.getText());
在你的情况下,如果你等待,你会发现它最终被附加了。您可以通过View#addOnAttachStateChangeListener()
API收到有关附加状态更改的通知。