1

Ich verwende ConstraintLayout beta4 und versuchen, eine horizontale Kette über den Bildschirm programmgesteuert zu erstellen.Programmgesteuerte Verbindung mehrerer Ansichten auf eine beliebige Größe mit ConstraintLayout

Das Problem, das ich in laufen lasse, wenn ich mehrere Ansichten zusammen in einer Kette über den Bildschirm (ex: Left side of layout <-> leftButton <-> rightButton <-> Right side of layout) dann gar nichts auftaucht verbinden. Hier

ist der Code, der nicht funktioniert:

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ConstraintLayout layout = (ConstraintLayout) View.inflate(this, R.layout.activity_main, null); 
    setContentView(layout); 

    ConstraintSet set = new ConstraintSet(); 
    set.clone(layout); 

    ConstraintLayout.LayoutParams anySizeParams = new ConstraintLayout.LayoutParams(0,0); 

    ImageButton leftButton = new ImageButton(this); 
    leftButton.setId(View.generateViewId()); 
    leftButton.setLayoutParams(anySizeParams); 
    layout.addView(leftButton); 

    ImageButton rightButton = new ImageButton(this); 
    rightButton.setId(View.generateViewId()); 
    rightButton.setLayoutParams(anySizeParams); 
    layout.addView(rightButton); 

    set.connect(leftButton.getId(),ConstraintSet.LEFT,layout.getId(),ConstraintSet.LEFT,0); 
    set.connect(leftButton.getId(),ConstraintSet.RIGHT,rightButton.getId(),ConstraintSet.LEFT,0); 
    set.connect(leftButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0); 
    set.connect(leftButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0); 

    set.connect(rightButton.getId(),ConstraintSet.LEFT,rightButton.getId(),ConstraintSet.RIGHT,0); 
    set.connect(rightButton.getId(),ConstraintSet.RIGHT,layout.getId(),ConstraintSet.RIGHT,0); 
    set.connect(rightButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0); 
    set.connect(rightButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0); 

    set.applyTo(layout); 

} 
} 

Und hier ist ein Screenshot von dem obigen Code: programmatically created.

Nachfolgend finden Sie einige xml, die die gleiche Sache beschreibt und funktioniert gut, als Referenz:

<ImageButton 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:id="@+id/right_button" 
    app:layout_constraintLeft_toRightOf="@+id/left_button" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" /> 

<ImageButton 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:id="@+id/left_button" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toLeftOf="@+id/right_button" 
    app:layout_constraintTop_toTopOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent"/> 

Hier ein Screenshot des xml: manually created

Antwort

1

Es gibt ein paar Probleme mit dem, was Sie tun. Zunächst weisen Sie beiden Objekten dieselbe LayoutParams-Instanz zu - das wird nicht funktionieren. Sie benötigen eine separate Instanz:

ConstraintLayout.LayoutParams anySizeParams2 = new ConstraintLayout.LayoutParams(0, 0); 
rightButton.setLayoutParams(anySizeParams2); 

Zweitens, haben Sie die Anschlüsse falsch:

set.connect(rightButton.getId(),ConstraintSet.LEFT, 
      rightButton.getId(),ConstraintSet.RIGHT,0); 

sein sollte:

set.connect(rightButton.getId(),ConstraintSet.LEFT, 
      leftButton.getId(),ConstraintSet.RIGHT,0); 

Wie sonst ist es nicht eine Kette geht zu erstellen.

Es wäre wahrscheinlich sauberer, das Layout zu klonen, nachdem Sie die Ansichten hinzugefügt haben.

Verwandte Themen