2016-05-13 1 views
0

Related question。回答:RelativeLayoutはできません。私はとにかく、ではなく、 RLのように、それをやる方法を尋ねています。ビューをRelativeLayoutのように甥ビューで揃えるにはどうすればいいですか?

一般的な話:調整が難しい複雑なレイアウトがあり、追加する必要があるものがネストされたビューに合わせて表示されます。
enter image description here

最適なアプローチは何ですか?カスタムスタイルのポップアップ? (まだそれらに慣れていない)?階層全体を単一のRelativeLayoutに変更した日数はどれくらいですか?ラッパーとしてのカスタムレイアウトクラス?
AbsoluteLayout(旧式)またはFrameLayoutをプログラムで変更してLayoutParamsまたは余白を変更しましたか?

簡略化された例(上記写真とは関係ありません):
LinearLayoutは要素の相対的な高さを定義します。私はRelativeLayoutでそれをすることを知らない。
anExpandableViewは、someBar(ここでは全角ですが、幅や縦の位置を揃える必要があるかもしれません)の下からスライドしてアニメーション化するものです。私が知っている

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include 
      android:id="@+id/topStuff" 
      layout="@layout/incl_topstuff" 
      android:layout_width="match_parent" 
      android:layout_weight="7" 
      android:layout_height="0dip" /> 

     <include 
      android:id="@+id/someBar" 
      layout="@layout/incl_filters_and_stuff" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <include 
      android:id="@+id/bottomStuff" 
      layout="@layout/incl_bottomstuff" 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="10" /> 

    </LinearLayout> 

    <include 
     android:id="@+id/anExpandableView" 
     layout="@layout/incl_filters" 
     android:visibility="gone" 
     android:layout_below="@id/someBar"/> 

</RelativeLayout> 

SO一般的な質問への嫌悪感を持っているが、私は、アドホックソリューションを望んでいません。 RelativeLayoutをラップするだけでは、直接の兄弟ではないビューにアライメントすることができれば、解決できるケースで何をすべきかを尋ねています。

+0

おそらく、あなたはあなたのビューが見えるようにするためのグラフィカルな図を提供することができます... – Elye

+0

私はそれを知っていた、特定のケースの需要。いいえ、私は拒否します。私は 'layout_alignBottom'や' layout_below'などと同等のことをしたい、兄弟ビューではなく、より深いネストされたものを参照しています。 'include'を使用しました。なぜなら、ビューが何であっても、' anExpandableView'がそれ自身を位置づける必要があるのは問題ではないからです。理解に問題がある場合は、不明な部分を指してください。 – kaay

+0

最初の文そのものは、すでに非常に暗いです。複雑なレイアウトがあり、入れ子になったビューに合わせて、何かを追加する要求が出ます。複雑なレイアウトはどういう意味ですか?ビューはネストされていると見なすことも、レイアウトに依存しないこともあります。したがって、適切なコンテキストがなければ、その質問を理解することは難しいです。 "a"という図式のダイアグラムが私たちにあなたに固い答えを与えるのであれば、おそらく2つ以上の図を提供して一般的な考え方を説明することができます。 – Elye

答えて

1

簡単に言えば、RelativeLayoutはそれを直接的に子どもたちのものに基づいて測定しレイアウトすることができますが、あなたはすでにそれを知っていたと思います。

唯一の一般的な解決策は、独自のカスタムレイアウトクラスを実装することですが、これはお勧めできません。 RelativeLayoutがレイアウト階層全体を横断しない理由を推測しなければならない場合は、おそらくパフォーマンス上の理由によるものです。

残念なことに、RelativeLayoutsとLinearLayoutsを使用していて、ビューを互いに依存させたい場合は、RelativeLayoutのフラット階層またはLinearLayoutのネストされたいずれかのアプローチを選択してそれに固執する必要があります。

私の知る限り、RelativeLayoutを使って加重ビューを実装する方法はないため、LinearLayoutを使用することに固執しています。

あなたが望むことを行う最も簡単な方法は、expandableViewをコード内で膨張させ、それをRelativeLayoutの下部に整列させ、bottomStuffに基づいて高さと位置を設定し、そこからアニメーション化することです。

xmlで実際にやりたいのであれば、ちょっとハッキーなアドホックなアプローチが考えられますが、少しの作業で階層の測定とレイアウトをミラーリングするために一般化できます。

最初のものの兄弟である平行では見えないLinearLayoutを作成します。上に重さが7、中にsomeBarの目に見えないコピー、そして重さが10である下の拡大可能なビューを空にします。それをスライドさせるには、不可視のsomeBarの高さと空の重さをアニメートします0に向かって上に表示するか、それらを削除するか、それらを削除して、LinearLayoutでanimateLayoutChangesを設定します。

+0

ありがとうございました。 Re: "1つのアプローチを選ぶ" - 'LinearLayout'は整列できません。 'RelativeLayout'はウェイトを実行できません。私は両方のビットが必要です。今のところ、私はビューを "無くし"、プログラムでマージンを設定します。ビューの座標を取得するより良い方法は、ビューとすべての祖先の 'getTop()'の値を再帰的に追加するよりも知っていますか? – kaay

+0

btw、私はパフォーマンスが理由だとは思わない。 findViewByIDは非常に頻繁に行われており、誰もが最適化を心配することはまだありません。循環参照を回避する可能性が高い – kaay

+1

相対オフセットを再帰的に追加するのではなく、View.getGlobalVisibleRectを使用して、座標を基準とする親ビューからオフセットしたり、rectのビューのサイズを取得したりできます。 RelativeLayout.LayoutParamsで高さと幅を設定します。なぜマージンを設定し、高さや位置を直接設定したくないのか分かりません。 具体的には、bottomStuffでView.getGlobalVisibleRectを使用し、rectの上下から高さを取得し、expandableViewをalignParentBottomに設定してexpandableViewの高さに設定します。 –

関連する問題