0

ViewGroup に基づいてカスタム レイアウトを作成することを検討してきましたが、(私が思うに) レイアウトの基になっている概念を理解しています。とにかく、それのいくつか。

どうやら基本的な考え方は

  • 最初に、すべての子ビューにどのくらいの大きさにしたいかを尋ねます - onMeasure() で
  • それに基づいてレイアウトを計算する
  • onLayout() で、希望のサイズに基づいてすべてを配置します

Web ページのレイアウトに少し似ていると思います。

しかし、私はそれをまったくしたくありません。使用可能な画面の領域 (x/y px) に基づいて、子ビュー (さまざまなテキスト、ボタン、フリーフォーム グラフィックス) が大量にあり、それらのサイズを定義し、テキスト サイズを設定してから配置する必要があります。つまり、私は彼らがどのくらい大きくなりたいかということにはほとんど興味がありません。

似たようなことをする AbsoluteLayout があります (ありました) が、減価償却されています。

レイアウトは子 (ジョブの完全に固定された数) と画面サイズに完全に結び付けられているため、次のことを提案しています。

  • 独自のカスタム レイアウト サブクラスの ViewGroup を作成する
  • どこか早い段階で - おそらくその onCreate() で? -すべての子を作成します(何が必要かを正確に知っています)
  • onMeasure() では、子が必要とするすべてを無視しますが、 setMeasuredDimension() がどこでも呼び出されることを確認して例外を回避するために measureChild() を呼び出し、渡された寸法に基づいてレイアウト (サイズ、位置) を計算する必要があると思われますwidth/heightMeasureSpecs
  • onLayout() では、すべての子供たちに、それがどうなるかを伝えます (「あなたはここにいて、これほど大きい」)
  • 私は子供たちがサイズ的に何を望んでいるのかには興味がないので、layoutRequest() コールバックを吸収して何もしません

ただし、これは概念的には、Android がレイアウトを行うべきだと考える方法に反しているように見えますが、それは私が必要としているものです。

だから私の質問は - それは実行可能なスキームですか?

4

3 に答える 3

1

のソースを取得AbsoluteLayoutして、ニーズに合わせて調整できます。が推奨されない場合AbsoluteLayout、それには理由があります。その理由が当てはまらない場合は、好きなことを自由に行うことができます。

于 2012-06-27T05:29:24.420 に答える
0

子にサイズを正確に伝えたい場合は、onMeasureを呼び出すときに、MeasureSpecモードで寸法を正確に渡します。彼らはこれに従うべきであり、あなたは彼らの要求されたサイズを無視するためにどんなハッキーな回避策もする必要はないはずです。

View.MeasureSpecエンコーディングを参照してください。onMeasureに渡される(int、int)は、measureSpecでエンコードされていると想定されています。

于 2012-06-27T05:35:06.863 に答える
0

はい、そうです。AbsoluteLayoutは非推奨ですが、ICSまで使用できます。

ただし、UIデザインを再考する必要があるかもしれません。これは、理由により非推奨になっています。

于 2012-06-27T05:33:09.050 に答える