2017-05-30 11 views
2

isAttachedToWindow()trueではなくfalseである理由を誰でも説明できますか?私は、添付の問題があるようです。isAttachedToWindow()は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の次のループで処理されますイベント。

具体的な例を挙げて説明します。あなたがwrap_content/wrap_contentのレイアウト属性を持つTextViewを持っているとします。あなたのケースでは

 


    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()の窓に取り付けることがビューに頼ることはできませんです。

無効 onStart()

onCreate(Bundle)後に呼び出され

- または活動が停止されていたonRestart() 後、しかし:あなたはonStart()のためのドキュメントによるとonStart()

後にisAttached()チェックを行う方がいいでしょうユーザに と表示されます。それにはonResume()が続きます。

派生クラスは、 をスーパークラスのこのメソッドの実装にコールする必要があります。 がそうでない場合、例外がスローされます。

したがって、開始時にアクティビティが表示されているため、ビューがウィンドウに添付されていると見なすことは安全です。逆に、onCreate()が呼び出されている可能性がありますが、アクティビティがまだユーザーに表示されていない可能性があります。そのため、ビューが添付されていない可能性があります。

+1

レイアウトや描画パスなど、ビュー階層のトラバーサルにアタッチされます。まだonCreate()で起きたことはありません。実際には 'onStart()'を経由せずに(例えば、そこに行く前に 'finish()'を呼び出すなどの活動を残すことができます。その場合、アタッチメントは決して起こりません。 – ephemient

関連する問題