2

私の最初の問題は、Viewプログラムでレイアウトを変更できるように、ルートの高さと幅を知る必要があることでした。私の目的では、この情報をonCreate();中に決定する必要は必ずしもありません。ルートのレイアウトが完了した後、プログラムで子を追加するだけで十分です。そのため、いつルートを呼び出して有効な結果を返すかを決定するためのフックとしてView喜んで使用します。onWindowFocusChanged()ViewgetWidth()getHeight()

Viewしかし、かなりの数の人が中にルートのサイズを決定する方法を尋ねてきましonCreate()た。ユーザーエクスペリエンスを向上させるために、おそらくこれを行いたいと考えていると思います-おそらく、ユーザーがレイアウトが段階的に構築されているのを見ないようにするためです(誰かが理由を明確にできる場合は、それをいただければ幸いです)。さて、私がこれに与えられた一般的な答えは、ここの のように、 a を内Runnableのルートにポストすることです。その中でなどを実行します。これが機能する理由は、にレイアウトがあるか、ウィンドウにアタッチされているときに、に投稿されたオブジェクトが実行されるようだからです。ViewonCreate()RunnablegetWidth()RunnableViewView

これは私の質問につながります。の API ドキュメントではView、この動作について説明していないようです。それで、誰かがそれが定義され、文書化されている場所を教えてもらえますか? それとも、ソースの検査の問題ですか?Runnablesのキューに残りView、レイアウト プロセス後の特定の時点でのみ処理される、絶対的かつ厳密に定義された機能ですか?

さらなる明確化:ケリーの答えを読んで、もう少し考えてみると、私の基本的な質問は次のように明確できますにを投稿することで、期間中に利用できます。Kerry が指摘しているように、このメッセージは が実行されるまで実行できないことが保証されています。レイアウトが の後に発生することは理解していますが、の寸法がわかっているときになぜこれを実行する必要があるのか​​ 、現時点ではまだ理解できません。View'sonCreate()RunnableViewRunnableonCreate()onCreateRunnableView

4

1 に答える 1

0

View.post(Runnable)メソッドを見てみましたが、そのメソッドを呼び出すことで、UI スレッド キューにメッセージを追加しているように思えます。「保証」される唯一のことは、post(Runnable) を呼び出したメソッドが完了した後に Runnable が実行されることです。これは、UI スレッドから post(Runnable) を呼び出していることを前提としていますが、ドキュメントにあるように:

このメソッドは、このビューがウィンドウにアタッチされている場合にのみ、UI スレッドの外部から呼び出すことができます。

ルートビューと子ビューの両方にサイズがあることを確認すると、子の onSizeChanged() メソッドから post(Runnable) を呼び出す必要があると思います。サイズもあるはずです。

これが少しとりとめのない答えである場合はお詫び申し上げます。あなたが達成したいことはある程度理解できますが、100%確実ではありません。何か明確にしてほしいことがあれば教えてください。

個人的には、ビューのサイズが必要なときはいつでも、 onSizeChanged() ですべてを行います。これは、「正しい」方法であると信じており、常に機能しています。

于 2012-07-05T10:36:47.243 に答える