isAttachedToWindow()返回false

时间:2017-05-30 23:03:31

标签: android android-view

任何人都可以解释为什么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();
    }
}

2 个答案:

答案 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收到有关附加状态更改的通知。