wake-up-neo.com

Wie bringt man alles in Sicht?

Ich habe Aktivitäten und viele Widgets, einige von ihnen haben Animationen, und aufgrund der Animationen bewegen sich einige der Widgets einer über den anderen. Zum Beispiel bewegt sich die Textansicht über einige Schaltflächen. . .

Nun, ich möchte, dass die Knöpfe immer vorne sind. Wenn sich die Textansicht bewegt, möchte ich mich hinter den Schaltflächen bewegen.

Ich kann das nicht erreichen Ich habe alles versucht, was ich weiß, und "bringToFront ()" funktioniert definitiv nicht.

hinweis: Ich möchte die Z-Reihenfolge nicht durch die Reihenfolge des Platzierens des Elements in das Layout steuern, da ich einfach nicht :), das Layout ist komplex und ich kann nicht alle Schaltflächen am Anfang des Layouts platzieren

94
Lukap

Sie können bringToFront () in der Ansicht aufrufen, die Sie in den Vordergrund bekommen möchten

Dies ist ein Beispiel:

    yourView.bringToFront();
113
Medo Elkamaly

Ich habe durch den Stack-Überlauf gesucht, um eine gute Antwort zu finden, und als ich keine finden konnte, habe ich mir die Dokumente angesehen.

niemand scheint über diese einfache Antwort gestolpert zu sein:

ViewCompat.setTranslationZ(view, translationZ);

die Standardübersetzung z beträgt 0,0 

32
shrewdu

bringToFront() ist der richtige Weg. Beachten Sie jedoch, dass Sie die bringToFront()- und invalidate()-Methode in der obersten Ansicht (unter Ihrer Stammansicht) aufrufen müssen, z. B.

Die Hierarchie Ihrer Ansicht ist:

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

Wenn Sie also Ihre Schaltflächen (1-> 6) zurück animieren, werden Ihre Schaltflächen (unter) unter der ImageView angezeigt. Um es (über) die ImageView zu bringen, müssen Sie die bringToFront()- und invalidate()-Methode für Ihre LinearLayouts aufrufen. Dann funktioniert es:) ** HINWEIS: Denken Sie daran, Android:clipChildren="false" für Ihr Root-Layout oder für gradparent_layout von animate-view festzulegen. Schauen wir uns meinen echten Code an:

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

Ein Code in .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);

Glück!

18
Justin

Versuchen Sie FrameLayout, damit haben Sie die Möglichkeit, Ansichten übereinander zu setzen. Sie können zwei LinearLayouts erstellen: eine mit den Hintergrundansichten und eine mit Vordergrundansichten, und diese mit der FrameLayout kombinieren. Hoffe das hilft.

14
Egor

Eine noch einfachere Lösung besteht darin, das XML der Aktivität zu bearbeiten. Benutzen

Android:translationZ=""
12
Toby

Mit diesem Code in xml

 Android:translationZ="90dp"
7
Krishna

Sie können versuchen, die bringChildToFront zu verwenden. Sie können auf der Android-Entwicklerseite überprüfen, ob diese Dokumentation hilfreich ist.

2
Emanuel

ich hatte das gleiche Problem ... die folgende Lösung hat für mich gearbeitet.

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

Es kann einen anderen Weg geben, der den Tag rettet. Initiieren Sie einfach einen neuen Dialog mit dem gewünschten Layout und zeigen Sie es einfach. Ich brauche es, um ein loadingView über ein DialogFragment zu zeigen.

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

bringToFront () funktioniert in manchen Fällen möglicherweise nicht wie meiner. Der Inhalt von dialog_top-Layout muss jedoch alles auf der UI-Ebene überschreiben. Dies ist jedoch eine hässliche Problemumgehung.

2
asozcan

Sie müssen Framelayout verwenden. Und der bessere Weg, dies zu tun ist, die Sicht unsichtbar zu machen, wenn dies nicht erforderlich ist. Sie müssen auch die Position für jede Ansicht festlegen, damit sie sich entsprechend der entsprechenden Position bewegen

0
Ranjit Mishra

Wenn Sie eine LinearLayout verwenden, sollten Sie myView.bringToFront() aufrufen und danach parentView.requestLayout() und parentView.invalidate() aufrufen, um das übergeordnete Element mit der neuen untergeordneten Bestellung neu zu zeichnen.

0
Cristian

Wenn Sie ConstraintLayout verwenden, setzen Sie das Element einfach nach den anderen Elementen, um es vor den anderen Elementen zu machen

0
Fajar Ulin Nuha