2017-10-09 4 views
5

Ich habe eine ConstraintLayout innerhalb einer NestedScrollView. Die ConstraintLayout enthält eine Reihe von Ansichten, aber die letzte View kann eine dynamische Höhe haben, um den unteren Platz zu füllen, wenn es welche gibt, aber es muss auch eine minimale Höhe sein, wenn nicht genug Platz ist.Ansicht mit minHeight in ConstraintLayout

Aus Gründen der Argumente, hier ist ein Beispiel.

<android.support.v4.widget.NestedScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true"> 

    <android.support.constraint.ConstraintLayout  
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     tools:layout_height="match_parent"> 

     <View 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      app:layout_constraintHeight_min="1500dp" 
      android:background="@color/red" 
      app:layout_constraintEnd_toEndOf="parent" 
      app:layout_constraintStart_toStartOf="parent" 
      app:layout_constraintBottom_toBottomOf="parent" 
      app:layout_constraintTop_toTopOf="parent"/> 

    </android.support.constraint.ConstraintLayout> 


</android.support.v4.widget.NestedScrollView> 

Wie Sie habe ich die ConstraintLayout Version in setzen sehen, aber es funktioniert nicht. Offensichtlich sind die Werte lächerlich groß, aber das ist nur zum Testen.

Wenn ich nicht fillViewport="true" auf dem NestedScrollView dann ConstraintLayout setzen Sie hat eine Höhe von 0. Wenn ich die fillViewport gesetzt haben, wird die ConstraintLayout nicht bewegen, sondern füllt einfach den Bildschirm.

Wie kann ich die Ansicht so einstellen, dass sie bis zum Ende der ConstraintLayout erweitert wird, die so groß wie der Viewport sein sollte, aber wenn meine Ansicht nicht von der minHeight ist, dann erlauben wir Scrollen?

Ich verwende Version 1.0.2 der ConstraintLayout Bibliothek.

Was ich zu sehen erwarte, ist das Wesen bis zum Ende des Elternteils, aber wenn diese Größe kleiner als 1500dp ist, scrollt die Ansicht.

Ich habe 1500dp wie so android:layout_height="1500dp" eingegeben und die Ansicht scrollt entsprechend.

UPDATE 1

scheint zu sein, wenn ich das Layout innerhalb eines FragmentViewPager setzen. Die Eigenschaft app:layout_constraintHeight_min wird nicht berücksichtigt und entspricht nur der Höhe des Ansichtsfensters.

Ich habe auch versucht, die NestedScrollView aus dem Fragment und setzen Sie die ViewPager hinein, aber wieder nicht funktioniert.

+0

Welche Version von 'ConstraintLayout' verwenden Sie? – Cheticamp

Antwort

6

Dieses Attribut zu der Ansicht, die Sie mögen Strecke haben:

app:layout_constraintHeight_default="spread" 

Ich habe eine kleine app zu demonstrieren.Keine Java-Logik zu sprechen, aber hier ist das Layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.NestedScrollView 
    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" 
    android:fillViewport="true"> 

    <android.support.constraint.ConstraintLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="16dp" 
     android:background="#caf"> 

     <TextView 
      android:id="@+id/one" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:gravity="center" 
      android:text="hello world" 
      android:background="#fff" 
      app:layout_constraintTop_toTopOf="parent" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintBottom_toTopOf="@+id/two"/> 

     <TextView 
      android:id="@+id/two" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:gravity="center" 
      android:text="hello world" 
      android:background="#eee" 
      app:layout_constraintTop_toBottomOf="@+id/one" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintBottom_toTopOf="@+id/three"/> 

     <TextView 
      android:id="@+id/three" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:gravity="center" 
      android:text="hello world" 
      android:background="#ddd" 
      app:layout_constraintHeight_default="spread" 
      app:layout_constraintHeight_min="300dp" 
      app:layout_constraintTop_toBottomOf="@+id/two" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintBottom_toBottomOf="parent"/> 

    </android.support.constraint.ConstraintLayout> 

</android.support.v4.widget.NestedScrollView> 

Die Ansicht von unten erstreckt sich das Ansichtsfenster zu füllen, wenn sie kleiner als der restliche verfügbare Speicherplatz ist, und Scrollen ist unmöglich:

enter image description here

die Unteransicht eine feste Höhe beibehält, wenn es größer ist als der verbleibende verfügbare Raum ist, der ermöglicht, Scrollen:

enter image description hereenter image description here

+0

Sieht aus wie dies die richtige Antwort ist. – azizbekian

+0

Danke für die gründliche Antwort. Ich habe deine Antwort verwendet, um zu debuggen, warum das Contraint-Layout nicht funktioniert hat, und habe festgestellt, dass andere Ansichten mit unterschiedlichen Einschränkungen nicht gut damit spielen. Ich änderte die Art, wie diese anderen Ansichten eingeschränkt waren und es begann zu arbeiten. Mein nächstes Problem ist, warum es nicht funktioniert, wenn ich es in meinem ViewPager einsetze ... – StuStirling

+0

Ok, es scheint der "ViewPager" zu sein, der das Problem verursacht – StuStirling

0

Ich verwende com.android.support.constraint:constraint-layout:1.0.2 und das funktioniert für mich:

<android.support.v4.widget.NestedScrollView 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" 
    android:orientation="vertical"> 

    <android.support.constraint.ConstraintLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <View 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:background="@drawable/gradient" 
      app:layout_constraintBottom_toBottomOf="parent" 
      app:layout_constraintEnd_toEndOf="parent" 
      app:layout_constraintHeight_min="1500dp" 
      app:layout_constraintStart_toStartOf="parent" 
      app:layout_constraintTop_toTopOf="parent" /> 

    </android.support.constraint.ConstraintLayout> 

</android.support.v4.widget.NestedScrollView> 
0

Als erstes müssen wir die feste Höhe für jede Textansicht oder den verwendeten Wrap-Inhalt als weitere Option angeben. Nebenstehend im Constraint-Layout hilft die Eigenschaft app: layout_constraintHeight_default = "spread" der letzten Ansicht verbleibender kompletter Platz bleibt übrig und wenn kein Platz mehr übrig ist, wird er automatisch mit der Scroll-Ansicht synchronisiert.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.NestedScrollView 
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" 
android:fillViewport="true"> 
<android.support.constraint.ConstraintLayout 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="#caf" 
android:padding="16dp"> 
<TextView 
android:id="@+id/one" 
android:layout_width="0dp" 
android:layout_height="48dp" 
android:background="#fff" 
android:gravity="center" 
android:text="hello world" 
app:layout_constraintBottom_toTopOf="@+id/two" 
app:layout_constraintLeft_toLeftOf="parent" 
app:layout_constraintRight_toRightOf="parent" 
app:layout_constraintTop_toTopOf="parent" /> 
<TextView 
android:id="@+id/two" 
android:layout_width="0dp" 
android:layout_height="48dp" 
android:background="#eee" 
android:gravity="center" 
android:text="hello world" 
app:layout_constraintBottom_toTopOf="@+id/three" 
app:layout_constraintLeft_toLeftOf="parent" 
app:layout_constraintRight_toRightOf="parent" 
app:layout_constraintTop_toBottomOf="@+id/one" /> 
<TextView 
android:id="@+id/three" 
android:layout_width="0dp" 
android:layout_height="48dp" 
android:background="#eee" 
android:gravity="center" 
android:text="hello world" 
app:layout_constraintBottom_toTopOf="@+id/four" 
app:layout_constraintLeft_toLeftOf="parent" 
app:layout_constraintRight_toRightOf="parent" 
app:layout_constraintTop_toBottomOf="@+id/two" /> 
<TextView 
android:id="@+id/four" 
android:layout_width="0dp" 
anroid:layout_height="48dp" 
android:background="#eee" 
android:gravity="center" 
android:text="hello world" 
app:layout_constraintBottom_toTopOf="@+id/five" 
app:layout_constraintLeft_toLeftOf="parent" 
app:layout_constraintRight_toRightOf="parent" 
app:layout_constraintTop_toBottomOf="@+id/three" /> 
<TextView 
android:id="@+id/five 
android:layout_width="0dp" 
android:layout_height="0dp" 
android:background="#ddd 
android:gravity="center" 
android:text="hello world" 
app:layout_constraintBottom_toBottomOf="parent" 
app:layout_constraintHeight_default="spread" 
app:layout_constraintHeight_min="300dp" 
app:layout_constraintLeft_toLeftOf="parent" 
app:layout_constraintRight_toRightOf="parent" 
app:layout_constraintTop_toBottomOf="@+id/three" /> 
</android.support.constraint.ConstraintLayout> 
</android.support.v4.widget.NestedScrollView> 
Verwandte Themen