web-dev-qa-db-ja.com

あらゆるものの前面に視界をもたらす方法は?

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

今、私はボタンが常に前面にあることを望んでいます。そして、textviewが動いているとき、私はボタンの後ろに動きたいです。

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

注:レイアウトに要素を配置する順序でzオーダーを制御したくないので、単にできません:)、レイアウトが複雑で、すべてのボタンをレイアウトの開始位置に配置することはできません

108
Lukap

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

これは一例です:

    yourView.bringToFront();
122
Medo Elkamaly

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

誰もまだこの簡単な答えにつまずいたようではありません:

ViewCompat.setTranslationZ(view, translationZ);

デフォルトの翻訳zは0.0

35
shrewdu

bringToFront()は正しい方法ですが、たとえば、次のように、(ルートビューの下の)最上位ビューでbringToFront()およびinvalidate()メソッドを呼び出す必要があることに注意してください。

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

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

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

.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);

ほら!

19
Justin

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

Android:translationZ=""
19
Toby

FrameLayoutを試してください。ビューを上下に並べることができます。 2つのLinearLayoutsを作成できます。1つは背景ビューで、もう1つは前景ビューで、FrameLayoutを使用して結合します。お役に立てれば。

14
Egor

このコードをxmlで

 Android:translationZ="90dp"
7
Krishna

bringChildToFrontを使用してみてください。 documentationAndroid Developersページ で役立つかどうかを確認できます。

2
Emanuel

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

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

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

Android:translationZ=""
2
Mudassir Khan

日を節約する別の方法があります。目的のレイアウトで新しいダイアログを初期化し、表示するだけです。 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レイヤー上のすべてをオーバーライドする必要があります。しかし、とにかく、これはworkい回避策です。

2
asozcan

ConstraintLayoutを使用している場合は、他の要素の後に要素を配置して、他の要素よりも前面に配置します。

2
Fajar Ulin Nuha

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

0
Ranjit Mishra

LinearLayoutを使用している場合は、myView.bringToFront()を呼び出し、parentView.requestLayout()およびparentView.invalidate()を呼び出してから、新しい子の順序で親を強制的に再描画する必要があります。

0
Cristian