AndroidでのRelativeLayoutのビューのZ順序の定義


226

AndroidでRelativeLayoutのビューのzオーダーを定義したいと思います。

これを行う1つの方法はを呼び出すことbringToFrontです。

これを行うより良い方法はありますか?レイアウトxmlでzオーダーを定義できればすばらしいと思います。


4
View.bringToFront(); anserです
Shirish Herwade

回答:


314

最も簡単な方法は、ビューがXMLファイルに追加される順序に注意を払うことです。ファイルの下部が低いほど、Z軸の上部が高いことを意味します。

編集:これは、Androidデベロッパーサイトのここここに記載されています。(@flightplannerに感謝)


16
残念ながら、これは常に変更できるとは限りません。たとえば、相対レイアウトでは、各要素はファイルで以前に定義されたものに対してのみレイアウトできます
Casebash

67
Casebash、私は必ずしも "@ + id / your_element_before_its_defined"を使用し、後で定義する要素で同じIDを使用する必要があるとは限りません。私はこれについて間違っているかもしれません、これらのレイアウトは私にとって非常にトリッキーですが、私は間違いなくそれが機能するという印象を得ます。
tjb

7
tjbは正しいです(そして私は彼がうれしいです)。@ + idは、IDの最初の言及とともに使用します。たとえば、layout_above = "@ + id / some_id"
Michiel

3
<item type = "id" name = "<your_id>" />をvalues xmlファイルに入れて、どこからでも参照できます。
karl

8
私はパーティーに約3年遅れていることを知っていますが、@ hpiqueへの回答として、これはここに
HexAndBugs 2013年


68

API 21以降のボタンやその他の要素は標高が高いため、親のレイアウトに関係なく、要素のxml順序を無視することに注意してください。それを理解するのにしばらくかかりました。


16
このバグの解決策は、ボタンの上にレンダリングしたいビューでsetElevation(1000)を呼び出すことでした。
ホールの

setElevation()には、APIレベル21
dp2050

21

APIレベル21以降のAndroidでは、レイアウトファイル内のアイテムは、正しい回答で説明されているように、ファイル内での順序付けからZオーダーを取得します。また、高度から、高度値が高いほど、アイテムはZオーダーが高くなります。 。

これにより、特に、XMLの順序に従ってZオーダーでそれらの下にあるはずの項目の上に頻繁に表示されるボタンで、問題が発生することがあります。これを修正するにandroid:elevationは、レイアウトXMLの項目のを設定して、達成したいZオーダーに一致させます。

レイアウトで要素の高さを設定すると、影が付き始めます。この効果が必要ない場合は、次のようなコードで影を削除できます。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   myView.setOutlineProvider(null);
}

レイアウトxmlを使用して、高架ビューの影を削除する方法が見つかりませんでした。


1
コメントで述べたように、を使用できますandroid:elevation="1000dp"。この方法では影はレンダリングされません。
Vadim Kotov

15

同じ問題が発生しました。相対レイアウトparentViewには、childView1とchildView2の2つの子があります。最初に、childView1をchildView2の上に置き、childView1をchildView2の上に配置します。子供のビューの順序を変更しても問題は解決しませんでした。私にとってうまくいったのは、parentViewと設定したコードでandroid:clipChildren = "false"を設定することです。

childView1.bringToFront();

parentView.invalidate();

2
これはうまくいき、Androidはとても悲しいです。child.bringToFront()parent.invalidate()動作しますが、parent.bringChildToFront(child)しません。私たち全員がOSに期待するロジックはどこにありますか?
Oliver Hausler、2015年

一部のビュー(XとYの平行移動)をアニメーション化するために、LinearLayout、FrameLayout、RelativeLayoutのいくつかの組み合わせを試しましたが、常に問題がありました(オーバーラップまたは比例しないサイズに関連)。最後android:clipChildren="false"にトリックをしました。ありがとうございました!
JCarlosR


13

の導入以来、私は答えを追加すると思いました

android:translationZ

XMLフィールドは少し変わった。実行を示唆する他の答え

childView1.bringToFront();

parentView.invalidate();

このコードは、XMLファイルでハードコードされたandroid:translationZを使用してビューの前にchildView1を表示しないため、完全に例外です。これに問題があり、他のビューからこのフィールドを削除すると、bringToFront()が正常に機能しました。


これは、android 5にも当てはまりますelevation
shelll

5

API 21にはview.setElevation(float)組み込み

ViewCompat.setElevation(view, float);下位互換性のために使用

その他の方法ViewCompat.setZ(v, pixels)ViewCompat.setTranslationZ(v, pixels)

ボタンまたはビュー配列を収集addViewし、RelativeLayoutに追加するために使用する別の方法




0

XMLのいずれかのビューに標高があるかどうかを確認します。その場合は、他のアイテムに標高を追加するか、標高を削除して問題を解決します。そこから、何が他のものより上に来るかを決定するのは、ビューの順序です。


0

または、重なり合うボタンまたはビューをFrameLayout内に配置します。次に、xmlファイルのRelativeLayoutは、追加された子レイアウトの順序を尊重します。


0

同じを達成するために、以下のコードサンプルを使用することもできます

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

これには下位互換性があります。ここにmCardViewあるはずのビューsourceViewです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.