すべての前に視界をもたらすには?


130

私はアクティビティとそれにたくさんのウィジェットを持っています、それらのいくつかはアニメーションを持っています、そしてアニメーションのためにいくつかのウィジェットは他のものの上に移動(翻訳)しています。たとえば、テキストビューが一部のボタンの上に移動しています。。。

ここで重要なのは、ボタンを常に前面に配置することです。そして、textviewが動いているとき、ボタンの後ろに移動したいと思います。

これを達成することはできません。知っているすべてのことを試しましたが、「bringToFront()」は確実に機能しません。

要素をレイアウトに配置する順序でZオーダーを制御したくないことに注意してください。原因は単純にできません。:)レイアウトは複雑で、すべてのボタンをレイアウトの先頭に配置できません。


3
RelativeLayoutXMLの最後に表示される「トップ」ビューを使用しました。stackoverflow.com/a/31340762/1121497を
Ferran Maylinch 2015

誰でも 'bringToFront'の対応するコードをxmlで教えてください
Shirish Herwade

xmlで仰角bottomView = elevation:1dpとtopView = elevation:2dpを使用してみてください|| ViewCompat.setElevation(View、int)
Tlacaelel Ramon Luis

回答:


144

前面に表示したいビューでbringToFront()を呼び出すことができます

これは例です:

    yourView.bringToFront();

4
予期しない結果:これを垂直線形レイアウトで使用し、前面に移動したビューが下部に表示されました...たとえば、前面に移動しA / B / CたかったAので、実行した後a.bringToFront()、のようなレイアウトになりましたB / C / A
Ferran Maylinch 2015

2
LinearLayoutで使用できないことがわかりましたbringToFront。を使用してしまいましたRelativeLayout。質問自体に対する私のコメントを参照してください。
Ferran Maylinch 2015

1
誰でも「bringToFront」のxmlで対応するコードを教えてください
Shirish Herwade

これにより、何らかの理由で前に移動している要素が再配置されます。ViewCompat.setTranslationZ(view, 1)一方、完全に動作します。
Bimde 2017

1
yourView.bringToFront();よりもアクティビティのマニフェストandroid:theme = "@ android:style / Theme.Light.NoTitleBar"で使用した場合 完全に機能しますが、私はandroid:theme = "@ android:style / Theme.AppCompat.Light.NoActionBar" yourView.bringToFront();を使用しました。動作しません。その手掛かり。
Rahul、2018年

41

良い答えを見つけるためにスタックオーバーフローを調べてきましたが、見つからない場合はドキュメントを調べました。

まだこの簡単な答えに出くわした人はいません。

ViewCompat.setTranslationZ(view, translationZ);

デフォルトの平行移動zは0.0です


これは、Z軸上の要素の位置(px単位)です。標高とも呼ばれます。setTranslationXは、X軸(左/右)に沿ってビューを移動し、Y軸(上/下)に沿ってsetTranslationYを移動します。Z軸は3番目の軸です。
xdevs23 2016年

どうsetZ()ですか?私が正しく思い出せば、結局のところ、ビューのZ位置はその標高とその並進Zです。
Gensoukyou1337

2
@ Gensoukyou1337の場合、 ViewCompat.setZ(view, yourValueInPixels); view.setZ()API 21以降でのみ機能します。
ジョニーファイブ

1
Android StudioでJava 8コードをチェックしました-SDK_INT> = 21の場合のみチェックするため、<21 apiの場合は効果がありません。
ヴァディム

32

さらに簡単な解決策は、アクティビティのXMLを編集することです。使用する

android:translationZ=""

3
これは、Android API 21以降でのみ役立ちます。
isakbob

25

bringToFront()正しい方法ですが、電話bringToFront()invalidate()(ルートビューの下の)最上位レベルのビューでメソッド。

ビューの階層は次のとおりです。

-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6

したがって、ボタン(1-> 6)をアニメーション化すると、ボタンはの下(下)に表示されますImageView。それを(上に)引き継ぐには、sのメソッドとメソッドをImageView呼び出す必要がbringToFront()ありinvalidate()ますLinearLayout。次に、それは動作します:) **注:android:clipChildren="false"ルートレイアウトまたはアニメーションビューのgradparent_layout を設定することを忘れないでください。実際のコードを見てみましょう:

.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:hw="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/common_theme_color"
    android:orientation="vertical" >

    <com.binh.helloworld.customviews.HWActionBar
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_actionbar_height"
        android:layout_alignParentTop="true"
        hw:titleText="@string/app_name" >
    </com.binh.helloworld.customviews.HWActionBar>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/action_bar"
        android:clipChildren="false" >

        <LinearLayout
            android:id="@+id/layout_top"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>

        <ImageView
            android:id="@+id/imgv_main"
            android:layout_width="@dimen/common_imgv_height"
            android:layout_height="@dimen/common_imgv_height"
            android:layout_centerInParent="true"
            android:contentDescription="@string/app_name"
            android:src="@drawable/ic_launcher" />

        <LinearLayout
            android:id="@+id/layout_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>

</RelativeLayout>

.javaのコード

private LinearLayout layoutTop, layoutBottom;
...
layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top);
layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom);
...
//when animate back
//dragedView is my layoutTop's child view (i added programmatically) (like buttons in above example) 
dragedView.setVisibility(View.GONE);
layoutTop.bringToFront();
layoutTop.invalidate();
dragedView.startAnimation(animation); // TranslateAnimation
dragedView.setVisibility(View.VISIBLE);

グラック!


他のボタンではなく、イメージビューの上にボタン6だけを表示したい場合はどうすればよいでしょうか。
Adam Katz

@AdamKatz:それらを別のレベルの拳に再編成する必要があると思います。次に、それをあなたの邪魔になります。
ジャスティン

ありがとうリサイクラービューの1つのアイテムだけをビューの上に表示しようとしていますが、他のアイテムはその下に残しておきます。
Adam Katz

同じものを使いました。ツールバーが非表示になるという単一の問題で問題なく動作します。
user2980181

これは複数のレベルで機能しますか?とをConstraintLayout含むがあるとします。RelativeLayoutもう1 RelativeLayoutつは、ルートConstraintLayoutmatch_parent)と同じサイズです。最初のRelativeLayoutはを持ちButton、2番目のの後ろ(zオーダー)にもありRelativeLayoutます。を使用しButtonて、最初RelativeLayoutにをすべての上にあるように見せて、表示してクリックできるようにすることはできView::bringToFront()ますか?
oaskamay 2018


18

試してみてくださいFrameLayout、それはあなたに上下にビューを置く可能性を与えます。2つを作成できます。1つLinearLayoutsは背景ビューで、もう1つは前景ビューで作成し、を使用してそれらを組み合わせることができますFrameLayout。お役に立てれば。


1
ダイアログのように、どうやってそれを上に持ってくることができますか?
Gaurav Arora

@Infinity、この目的でFragmentDialogを作成するか、アクティビティにTheme.Dialogを使用できます。
Egor

FragmentDialogは、API 10と互換性がないため使用できません。次に、アプリケーションのテーマを既に使用しています。他に方法はありますか?あなたが言ったように私はそれをFrameLayoutで使用しました!
Gaurav Arora

@Infinity、あなたはAPI 4から入手可能である、FragmentDialogの互換ライブラリのバージョンを使用することができます
Egor



3

日を救う別の方法がある可能性があります。希望するレイアウトで新しいダイアログを初期化し、それを表示するだけです。DialogFragmentにloadingViewを表示するために必要であり、これが私が成功した唯一の方法でした。

Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
topDialog.setContentView(R.layout.dialog_top);
topDialog.show();

bringToFront()は、私のように機能しない場合があります。しかし、dialog_topレイアウトのコンテンツは、UIレイヤー上の何もオーバーライドする必要があります。しかし、とにかく、これは醜い回避策です。


3

私は同じ問題に直面しました。次の解決策は私のために働きました。

 FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
        glFrame.addView(yourView);
        glFrame.bringToFront();
        glFrame.invalidate();

2番目の解決策は、この属性をビューxmlに追加するxmlを使用することです

android:translationZ=""

2

次のようにBindingAdapterを使用できます。

@BindingAdapter("bringToFront")
public static void bringToFront(View view, Boolean flag) {
    if (flag) {
        view.bringToFront();
    }
}


  <ImageView
        ...
        app:bringToFront="@{true}"/>

0

framelayoutを使用する必要があります。そして、これを行うためのより良い方法は、必要のないときにビューを非表示にすることです。また、ビューごとに位置を設定して、対応する位置に従って移動するようにする必要もあります。


0

を使用しているLinearLayout場合は、をmyView.bringToFront()呼び出しparentView.requestLayout()parentView.invalidate()から呼び出し、親に新しい子注文で再描画させる必要があります。



0

スタックのおかげでユーザーを超えるこの説明は、私もAndroidの4.1.1でこの作業を持っています

((View)myView.getParent()).requestLayout();
myView.bringToFront();

たとえば、私の動的な使用については、

public void onMyClick(View v)
     {
     ((View)v.getParent()).requestLayout();
     v.bringToFront();
     }

そしてバム!


-2

表示したい順に並べます。ビュー2の上にビュー1を表示したいとします。次に、ビュー2のコードを記述してから、ビュー1のコードを記述します。この順序付けができない場合は、前面に表示したいレイアウトのルートビューに対してbringToFront()を呼び出します。


-32

他のビューの可視性をfalseに設定できます。

view1.setVisibility(View.GONE);
view2.setVisibility(View.GONE);
...

または

view1.setVisibility(View.INVISIBLE);
view2.setVisibility(View.INVISIBLE);
...

そしてセット

viewN.setVisibility(View.VISIBLE);

4
すべてが見えるようにする必要があります。それは問題ではありません。問題はzオーダーです。実行可能性が問題だった場合は、簡単に解決できます。。。
Lukap 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.