2016-12-31 5 views
4

Ich versuche, eine horizontale LinearLayout konvertieren, die 4 Tasten der gleichen Größe zu einem ConstraintLayout hat. Das Problem ist, dass, wenn ich eine oder mehrere Tasten auf android:visibility="gone" in LinearLayout setzen die verbleibenden Tasten Größe ändern, um den gesamten Raum nehmen (alle werden die gleiche Größe) und in der ConstraintLayout die Tasten entfernt sind, aber immer noch den Raum nehmen.Convert LinearLayout in ConstraintLayout Problem

EDIT: Je nach App-Status werden verschiedene Schaltflächen sichtbar sein.

Was muss ich ändern, damit sich die ConstraintLayout wie die LinearLayout verhält?

EDIT: Ich fand einen Fehler in der ConstraintLayout (Constraint-Referenzen), also habe ich es aktualisiert und die Bilder (das Problem besteht immer noch).

LinearLayout xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <Button 
     android:id="@+id/b1" 
     android:text="B1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="50" 
     /> 

    <Button 
     android:id="@+id/b2" 
     android:text="B2" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="50" 
     android:visibility="gone" 
     /> 

    <Button 
     android:id="@+id/b3" 
     android:text="B3" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="50" 
     /> 

    <Button 
     android:id="@+id/b4" 
     android:text="B4" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="50" 
     /> 
</LinearLayout> 

EDIT:ConstraintLayout xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:id="@+id/b1" 
     android:text="B1" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toLeftOf="@+id/b2" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintHorizontal_weight="1" 
     /> 

    <Button 
     android:id="@+id/b2" 
     android:text="B2" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     android:visibility="gone" 
     app:layout_constraintLeft_toRightOf="@+id/b1" 
     app:layout_constraintRight_toLeftOf="@+id/b3" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintHorizontal_weight="1" 
     /> 

    <Button 
     android:id="@+id/b3" 
     android:text="B3" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     app:layout_constraintLeft_toRightOf="@+id/b2" 
     app:layout_constraintRight_toLeftOf="@+id/b4" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintHorizontal_weight="1" 
     android:layout_marginTop="0dp"/> 

    <Button 
     android:id="@+id/b4" 
     android:text="B4" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     app:layout_constraintLeft_toRightOf="@+id/b3" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintHorizontal_weight="1" 
     /> 
</android.support.constraint.ConstraintLayout> 

LinearLayout vs ConstraintLayout ConstraintLayout blueprint

+0

Warum möchten Sie das lineare Layout ersetzen, wenn es korrekt funktioniert? ist es langsam? isst es viel Gedächtnis? – pskink

+0

Ich habe eine komplexe Layoutstruktur, also konvertiere ich sie in ein Constraint-Layout. Dies ist ein Teil, den ich nicht konvertieren konnte. – Hanan

+0

Ich weiß, dass ich das lineare Layout in das Beschränkungslayout einbetten kann, aber möchte es vermeiden (nach meinem Verständnis ist der Zweck des Einschränkungslayouts das Entfernen der tiefen Layouthierarchie). – Hanan

Antwort

1

Sie können sich wahrscheinlich Ihr Layout etwas ändern wie:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <Button 
     android:id="@+id/b1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:text="B1" 
     app:layout_constraintBaseline_toBaselineOf="@+id/b3" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toLeftOf="@+id/b3" 
     tools:layout_constraintBaseline_creator="1" 
     tools:layout_constraintLeft_creator="1" 
     tools:layout_constraintRight_creator="1" /> 

    <Button 
     android:id="@+id/b2" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:text="B2" 
     android:visibility="gone" 
     app:layout_constraintBottom_toTopOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toLeftOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     tools:layout_constraintBottom_creator="1" 
     tools:layout_constraintLeft_creator="1" 
     tools:layout_constraintRight_creator="1" 
     tools:layout_constraintTop_creator="1" /> 

    <Button 
     android:id="@+id/b3" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="128dp" 
     android:layout_marginLeft="128dp" 
     android:layout_marginRight="128dp" 
     android:layout_marginStart="128dp" 
     android:text="B3" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     tools:layout_constraintLeft_creator="1" 
     tools:layout_constraintRight_creator="1" 
     tools:layout_constraintTop_creator="1" /> 

    <Button 
     android:id="@+id/b4" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:text="B4" 
     app:layout_constraintBaseline_toBaselineOf="@+id/b3" 
     app:layout_constraintLeft_toRightOf="@+id/b3" 
     app:layout_constraintRight_toRightOf="parent" 
     tools:layout_constraintBaseline_creator="1" 
     tools:layout_constraintLeft_creator="1" 
     tools:layout_constraintRight_creator="1" /> 

</android.support.constraint.ConstraintLayout> 

Wenn Sie eine harte Zeit mit Schalen ein vorhandenes Layout ConstraintLayout, können Sie voran gehen und versuchen, Android Studio interne Design-Tools Ihnen mit ihm zu helfen. Sie können zu Design Registerkarte wechseln und Komponente Fenster öffnen, klicken Sie mit der rechten Maustaste auf das Element, das Sie konvertieren möchten, und wählen Sie ConvertLayout.

+0

Das sieht OK aus, wenn B2 weg ist, aber wenn ich einen anderen Knopf verberge, funktioniert es nicht OK. Ich nehme an, dass es nicht klar war (ich werde die Frage auch aktualisieren), aber programmgesteuert ändere ich die Sichtbarkeit der Schaltflächen entsprechend dem App-Status. – Hanan

+1

Der Versuch, die AndroidStudio-Konvertierungstools zu verwenden, hat das Problem nicht gelöst. – Hanan

1

Sie können ein beliebiges Layout in ein ConstraintLayout konvertieren, indem Sie auf die Design-Registerkarte im Layout-Editor gehen.

+1

Ich weiß, aber das Problem ist, dass es sich nicht richtig verhält, wenn Sie die Sichtbarkeit der Schaltflächen auf "GONE" ändern. – Hanan

Verwandte Themen