2017-05-30 506 views
2

任何人都可以解释为什么isAttachedToWindow()false而不是true?我似乎有附件问题。isAttachedToWindow()returns false

据我了解,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(); 
    } 
} 

回答

1

当你执行的是视图相关的动作,这种变化实际上并不会立即执行,而是将在主线程的MessageQueue,后来这些消息会被Looper的下一个循环处理发布事件。

让我们来说一个具体的例子。想象一下你有一个TextViewwrap_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获知有关附加状态更改的通知。

1

猜测是你不能依靠视图onCreate()实际连接到窗口。你最好做你isAttached()检查后onStart()

根据该文档为onStart()

无效onStart()

onCreate(Bundle)后调用 - 或onRestart() 活动时已被停止后,但现在再次向用户显示 。接下来是onResume()

派生类必须调用 来实现超类的这种方法。如果 他们没有,则会抛出异常。

所以,一旦开始被调用,活动就会显示给用户,这意味着假设您的视图被附加到窗口是安全的。相反,onCreate()可能已被调用,但该活动可能尚未显示给用户 - 因此您的视图可能未附加。

+1

它将被附加在视图层次结构的遍历上,比如布局或绘制过程。 'onCreate()'还没有发生。实际上,可以在不通过'onStart()'的情况下离开活动 - 例如,如果在到达那里之前调用'finish()',那么在这种情况下,附件永远不会发生。 – ephemient