it-swarm.com.de

Wie sende ich die Ansicht zurück? Wie kann ich die Z-Reihenfolge programmgesteuert steuern?

Ich habe ein Problem, die Ansicht nach hinten zu senden. In Android haben wir eine Methode wie bringToFront(), um die Ansicht auf eine andere Ansicht zu platzieren. So möchte ich die Ansicht unter das vorherige Bild setzen. 

Gibt es eine Methode wie sendToBack() oder bringToBack() in Android? Wenn ja, kann mir jemand dabei helfen? 

Hinweis: Ich möchte die Z-Reihenfolge nicht durch die Reihenfolge der Anordnung von Elementen im Layout steuern. Ich möchte die Z-Reihenfolge programmgesteuert steuern. 

Ich möchte die Ansichten auf der Vorderseite nicht verbergen. Ich möchte nur, dass sie sich hinter der sich bewegenden Ansicht befinden. 

49
Lukap

Afaik, dafür gibt es keine integrierte Lösung. Ich denke, Sie versuchen, die Z-Reihenfolge in einem FrameLayout oder etwas Ähnlichem zu ändern.

Ich denke jedoch, dass Sie die Reihenfolge der enthaltenen untergeordneten Elemente im Layout ändern können. RemoveChild ... () - und addView () - Methoden können Positionswerte annehmen, sodass Sie höchstwahrscheinlich untergeordnete Elemente austauschen können, und dies würde die Z-Reihenfolge ändern. Es scheint jedoch eine etwas hackige Lösung zu sein.

Oder erwägen Sie, die Sichtbarkeitseigenschaft der untergeordneten Ansichten zu ändern. Möglicherweise erhalten Sie ein ähnliches Verhalten, und das wäre viel sauberer, denke ich.

Bearbeiten:

Mit der neuen Android-Version, der L Developer Preview, scheint es so, als könnten wir endlich die Z-Reihenfolge der Ansichten ändern. 'Elevation' und 'TranslationZ' Eigenschaften zur Rettung: https://developer.Android.com/preview/material/views-shadows.html

30

Mir ist klar, dass dies in anderen Antworten impliziert wurde, aber niemand hat den Code gepostet. Ich behalte Folgendes in einer Utility-Klasse, in der ich Hilfsfunktionen für den Umgang mit Ansichten habe:

public static void sendViewToBack(final View child) {
    final ViewGroup parent = (ViewGroup)child.getParent();
    if (null != parent) {
        parent.removeView(child);
        parent.addView(child, 0);
    }
}
61
Turix

Es gibt keine sendToBack()-Methode. Wenn Sie jedoch bringToFront() in der unteren Position aufrufen, erhalten Sie fast denselben Effekt.

38
Pepijn

Rufen Sie bringToFront() für die Ansicht auf, die Sie in den Vordergrund erhalten möchten, und rufen Sie dann die invalidate()-Methode für alle Ansichten auf, einschließlich der Ansicht, die Sie im Vordergrund haben möchten. Wiederholen Sie dies für alle Zuhörer.

Wenn also der Listener einer anderen Ansicht aufgerufen wird, wird die vorherige Ansicht ungültig und befindet sich im Hintergrund.

19
noob

Hier ist die Methode, die ich verwende, um eine Ansicht nach hinten zu senden (also entgegengesetzt zu bringToFront, Art sendToBack):

    private void moveToBack(View myCurrentView) 
    {
        ViewGroup myViewGroup = ((ViewGroup) myCurrentView.getParent());
        int index = myViewGroup.indexOfChild(myCurrentView);
        for(int i = 0; i<index; i++)
        {
            myViewGroup.bringChildToFront(myViewGroup.getChildAt(i));
        }
    }

Hoffe das hilft!

8
Al-Noor Ladhani

Bitte beachten Sie, dass Sie view.setZ(float) ab API Level 21 verwenden können. Hier finden Sie weitere Informationen.

2
Vadim Kotov

es funktioniert gut wie bringen zurück ()

public void moveToBack(ViewGroup viewGroup, View v) {
    int s = 1;
    for (int i = 1; i < viewGroup.getChildCount(); i++) {
        if (viewGroup.getChildAt(1) == v) {
            s = 2;
        } else {
            viewGroup.getChildAt(s).bringToFront();
        }
    }
}
1
Behnam Tajadini

In Ihrer XML-Datei müssen Sie in der folgenden Reihenfolge schreiben:

<FrameLayout
Android:id="@+id/frameLayoutXML"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
<ImageView
 Android:id="@+id/imageViewXML"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/floatB_XML"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center" />
</FrameLayout>

In diesem Fall ist die imageView hinter der FloatingActionButton.

Wenn Sie etwas ändern möchten und dies programmgesteuert tun, dann:

public class SomeActivity extends AppCompatActivity {

    //declare variables
    ImageView imageView;
    FrameLayout frameLayout;
    FloatingActionButton floatingActionButtonNew;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //Here is to call what already exists at XML file
        frameLayout=findViewById(R.id.frameLayoutXML);   
        imageView = findViewById(R.id.imageViewXML);
        //Here is to declare a new Element to add to the view, but is not at XML File
        floatingActionButtonNew=New FloatingActionButton(this);
        frameLayout.removeAllViews();  //here you remove all views.
        frameLayout.addView(imageView);//And you add again the imageView first
        floatingActionButtonNew.setLayoutParams(new 
         RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT,
          RelativeLayout.LayoutParams.WRAP_CONTENT
        )); //Then you can give some format to your floatingButtonNew

        //And finally  add to the frameLayout the new View in this case the floatingButtonNew
        frameLayout.addView(floatingActionButtonNew);
    }
}

In dieser Reihenfolge der Ansichtsdeklarationen erhalten Sie das Bild wieder von der schwebenden Schaltfläche zurück. Die Ansicht, die zuerst deklariert wird, ist wieder aus der Ansicht, die als Zweites deklariert wird, und der Schlüssel zum Erzielen der Reihenfolge ist removeAllViews einer FrameLayout oder LinearLayout und diese Ansichten werden hinzugefügt, wenn Sie programmgesteuert hinzufügen.

1
Vero Gorena

Sie können auch versuchen, die Funktionalität der ViewGroup.addViewInLayout()-Methode zu verwenden, die einen Index übernimmt und bestimmt, ob die Ansicht am Ende oder am Anfang der Liste steht

1
teoREtik

Sie könnten versuchen, view.setVisibility(View.INVISIBLE) oder view.setVisibility(View.GONE) auszuführen.

UPDATE:

Dies zeigt Ihnen, wie Sie das erreichen, was Sie tun möchten.

0
A. Abiri

Wenn Sie die appCompat-Bibliothek verwenden, können Sie die Z-Reihenfolge für Geräte mit einer niedrigeren API-Ebene als 21 auf andere Weise ändern:

ViewCompat.setTranslationZ(view, zValue);
0
Fragment

Ich würde entweder die Sichtbarkeit auf 0 setzen oder einfach die Sicht unter die Sichtweite bringen.