2017-10-09 78 views
5

我在NestedScrollView內有ConstraintLayoutConstraintLayout包含一堆視圖,但最後的View可以有一個動態高度來填充底部空間(如果有),但如果沒有足夠的空間,它也需要是最小高度。查看minHeight in ConstraintLayout

爲了討論起見,下面是一個例子。

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

正如你所看到的,我已經把ConstraintLayout版本,但它不起作用。很明顯,這些值非常大,但這只是爲了測試。

如果我不設置在NestedScrollView然後ConstraintLayoutfillViewport="true"具有0的高度。當我設置fillViewport,該ConstraintLayout不滾動,但只是充滿屏幕。

如何設置視圖使其擴大到ConstraintLayout的底部,該視口應與視口一樣大,但如果我的視圖不是minHeight那麼我們允許滾動?

我正在使用ConstraintLayout庫的1.0.2版本。

我期望看到的是一直到父母的底部,但如果該大小小於1500dp那麼視圖會滾動。

我輸入了1500dp,就像android:layout_height="1500dp"那樣,並且視圖會相應地滾動。

更新1

好像是有一次我把一個FragmentViewPager內的佈局。 app:layout_constraintHeight_min屬性不受尊重,它只匹配視口的高度。

我也試着把NestedScrollView從片段中拿出來,把ViewPager放在裏面,但是再次沒有成功。

+0

您正在使用哪個版本的'ConstraintLayout'? – Cheticamp

回答

6

這個屬性添加到視圖,您想有彈力:

app:layout_constraintHeight_default="spread" 

我做了一個小的應用程序來證明。沒有Java道理可講的,但這裏的佈局:

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

仰視圖拉伸以填充視口時,它比剩餘的可用空間變小,滾動是不可能的:

enter image description here

當底部視圖大於剩餘可用空間時,它會保持一個固定的高度,從而使滾動成爲可能:

enter image description hereenter image description here

+0

看起來這是正確的答案。 – azizbekian

+0

感謝您的徹底解答。我用你的答案來調試爲什麼約束佈局不起作用,並發現其他具有不同約束的視圖並沒有很好地與它配合。我改變了這些其他觀點受到限制的方式,並開始工作。我的下一個問題是,爲什麼它不工作,當我把它放在我的ViewPager中... – StuStirling

+0

好吧,它似乎是'ViewPager'這是造成問題 – StuStirling

0

我使用com.android.support.constraint:constraint-layout:1.0.2,這對我的作品:

<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

第一件事是我們必須爲每個文本視圖或使用包裝內容指定固定高度作爲另一個選項。內部約束佈局的屬性app:layout_constraintHeight_default =「spread」幫助最後一個視圖獲取剩餘的剩餘空間,如果沒有剩餘空間,則自動同步滾動視圖。

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