159

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

今問題は、ボタンを常に前面に配置したいということです。テキストビューが動いているときは、ボタンの後ろに移動したいと思います。

私が知っていることはすべて試しましたが、「bringToFront()」は確実に機能しません。

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

4

17 に答える 17

163

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

これは例です:

    yourView.bringToFront();
于 2014-04-18T12:35:51.933 に答える
51

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

この単純な答えにまだ誰も出くわしていないようです。

ViewCompat.setTranslationZ(view, translationZ);

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

于 2015-12-21T08:03:46.337 に答える
26

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

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

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

したがって、ボタンをアニメートすると (1->6)、ボタンは の下 (下) になりImageViewます。それを(上に)持ち込むには、を呼び出してメソッドを作成ImageViewする必要があります。その後、動作します:) **注:ルート レイアウトまたはアニメーション ビューの gradparent_layout を設定することを忘れないでください。私の実際のコードを見てみましょう:bringToFront()invalidate()LinearLayoutandroid: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);

グラック!

于 2014-05-15T04:00:07.667 に答える
18

試してみてくださいFrameLayout。ビューを上下に配置する可能性があります。2 つのを作成できます。1LinearLayoutsつはバックグラウンド ビューで、もう 1 つはフォアグラウンド ビューで、FrameLayout. お役に立てれば。

于 2011-07-20T09:05:41.953 に答える
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 レイヤーのすべてをオーバーライドする必要があります。とにかく、これは醜い回避策です。

于 2016-04-15T08:50:05.727 に答える
1

この説明に対するStackユーザーのおかげで、Android 4.1.1 でも動作するようになりました。

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

たとえば、私の動的な使用では、

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

そしてバム!

于 2020-07-07T04:53:56.133 に答える
0

フレームレイアウトを使用する必要があります。これを行うためのより良い方法は、必要のないときにビューを非表示にすることです。また、対応する位置に従って移動するように、すべてのビューの位置を設定する必要があります

于 2012-01-04T14:39:14.760 に答える
-36

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

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

また

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

そしてセット

viewN.setVisibility(View.VISIBLE);
于 2011-07-20T12:07:39.177 に答える