4

再帰的な階層レイアウトを構築しています。これが私の message_with_replies.xml です (アイデアを明確にするために、配置属性といくつかの項目を削除しました):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    <Button
        android:id="@+id/toggleReplies"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/button_expand_replies" />
    <LinearLayout
        android:id="@+id/replies"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>
</RelativeLayout>

Java コードでは、このレイアウトでアイテムを膨らませ、親の返信レイアウトに埋め込みます。次に、これを子で繰り返して、ツリーを形成します。

root item
- child 0 of root
- - child 0 of child 0 of root
- - child 1 of child 0 of root
- - - child 0 of child 1 of child 0 of root
- child 1 of root
- child 2 of root
- child 3 of root
- - child 0 of child 3 of root

トップレベルまたはトップから約 2 ~ 3 レベルにいるときは、すべての見た目もパフォーマンスも問題ありませんが、深くなるにつれて、レイアウトの応答が遅くなります。スローダウンは非線形で、約 7 または 8 の深さで UI が完全に動かなくなります (エミュレーターは約 30 分考えた後に例外を発生させます)。

明らかに、問題は埋め込みレイアウトです。線形レイアウトを相対レイアウトに埋め込むので、階層の新しいレベルごとに、UI レイアウトに関して 2 つの追加の埋め込みを意味します。

これを最適化する方法は?

線形レイアウトを取り除こうとすることもできますが、それでも問題は解決しないと思いますが、埋め込みがまだ残っているため、問題をより深いレベルに延期するだけです。

別のレイアウトでサブアイテムを膨らませるとき、階層をフラットに保つことは一般的に可能ですか? 商品を膨らませてから、容器なしで中身を取り出すことはできますか?

追加:問題を回避しました。マージンを使用してツリーを構築するようになったので、レイアウトが埋め込まれず、UI が動かなくなりました。すべてが正常に機能します。

ただし、元の質問にはまだ回答がありません。

4

1 に答える 1

4

トップレベルまたはトップから約 2 ~ 3 レベルにいるときは、すべての見た目もパフォーマンスも問題ありませんが、深くなるにつれて、レイアウトの応答が遅くなります。スローダウンは非線形で、約 7 または 8 の深さで UI が完全に動かなくなります (エミュレーターは約 30 分考えた後に例外を発生させます)。

すでに見たように、問題はレイアウト ファイルの部門です。を膨らませてmessage_with_replies.xmlに追加するたびLinearLayoutに、レイアウトの深さを 2 増やします (パフォーマンスが低下します)。したがって、レベル 7 ~ 8 に到達するまでに、推奨される最大レイアウト デプト (10、私が間違っていなければ 10) をすでにかなり超えていることになります。

これを最適化する方法は?

古いビューでレイアウトを拡張し続けたい場合は、何もする必要はありません。それ以外の場合は、ビューを間に追加せずにマスター レイアウトに追加しますViewGroups

別のレイアウトでサブアイテムを膨らませるとき、階層をフラットに保つことは一般的に可能ですか? 商品を膨らませてから、容器なしで中身を取り出すことはできますか?

レイアウトに追加するだけであれば、階層をフラットに保つことができViewsます。ViewGroups追加する限りViewGroups(コードで行うように)、階層の部門を増やすことができます。不要な追加を避けるオプションViewGroups(場合によっては) は、mergeタグを使用することです (詳細については、こちらを参照してください)。

追加: 問題を回避しました。マージンを使用してツリーを構築するようになったので、レイアウトが埋め込まれず、UI が動かなくなりました。すべてが正常に機能します。

これは、はるかに単純な解決策であるため、レイアウトを何度も膨らませる代わりに、最初のオプションである必要があります。レイアウトは、単純なLinearLayout(または、レイアウトからレイアウト属性を削除したため、セットアップRelativeLayoutがわからない)を使用して取得できます。このレイアウトに、必要なビューを追加し、この子にしたいレベルに基づいてマージンを追加することを考慮します。物事をさらに単純化したい場合は、以下のようなレイアウト ファイルを作成します (これは、レイアウトの が の上に設定されている場合に機能します)。orientationverticalButtonLinearLayout

<merge>
    <Button android:id="@+id/toggleReplies">
    <!-- content of the replies at this level -->
</merge>

このレイアウトを膨張させた後、パディングを設定する必要があります (最初のレベルでは x パディング、2 番目のレベルでは 2x、3 番目のレベルでは 3x など) LinearLayout、.

于 2012-09-18T18:58:35.680 に答える