2017-12-04 8 views
0

純粋なXMLでは、スクロールが必要なもののリストを作成しています。私はLinearLayoutの加重合計が3であり、その内部に4つの項目が含まれています。 LinearLayoutの中のアイテムはすべて、両親の身長の133%になります。Androidスクロール加重和> 100%

は例をダウントリム:

<LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:orientation="vertical" 
    android:weightSum="3"> 

    <RelativeLayout android:layout_weight="1" /> 
    <RelativeLayout android:layout_weight="1" /> 
    <RelativeLayout android:layout_weight="1" /> 
    <RelativeLayout android:layout_weight="1" /> 

</LinearLayout> 

は、どのように私はビューに最後のアイテムを持ってScrollViewを使用することができますか? LinearLayoutをスクロールするだけで、レイアウトの高さの概念がすべて失われ、子供の高さが伸びずにwrap_contentになります。

Before and After ScrollView

答えて

1

あなたは、単に(代わりに重量を使用しての)4つの内部の各ビューに一定の高さを提供することができなければ、私は、Javaコードそれに頼ることなく、あなたが欲しいものを行うにはどのような方法があります信じていません。内側ビューの高さを調整します。

最初にスクロールするには、ScrollViewの内容がScrollViewより大きい必要があります。つまり、LinearLayoutandroid:layout_height="match_parent"を使用することはできず、スクロールも可能です。

第2に、layout_weightは、子ビューの間に超過の領域のみを配信します。つまり、この属性は、子ビューの固有次元が親ビューよりも小さい場合にのみ有効です。つまり、LinearLayoutにはandroid:layout_height="wrap_content"を使用できません。また、高さの加重分布も得られます。

これは、唯一のオプションとして一定の高さを設定します。

あなたが動的子ビューの高さを更新するために、Javaコードを使用して[OK]をしている場合は、ここでそれを行うためのテンプレートです:

レイアウト

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scroll" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <View 
      android:id="@+id/one" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:background="#caf"/> 

     <View 
      android:id="@+id/two" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:background="#fff"/> 

     <View 
      android:id="@+id/three" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:background="#fca"/> 

     <View 
      android:id="@+id/four" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:background="#afc"/> 

    </LinearLayout> 

</ScrollView> 

のJava:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final View scrollingParent = findViewById(R.id.scroll); 
    scrollingParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int childHeight = scrollingParent.getHeight()/3; 
      setHeight(R.id.one, childHeight); 
      setHeight(R.id.two, childHeight); 
      setHeight(R.id.three, childHeight); 
      setHeight(R.id.four, childHeight); 
     } 
    }); 
} 

private void setHeight(int viewId, int height) { 
    View v = findViewById(viewId); 
    ViewGroup.LayoutParams params = v.getLayoutParams(); 
    params.height = height; 
    v.setLayoutParams(params); 
} 

ViewTreeObserver.OnGlobalLayoutListenerクラスおよび関連するaddOnGlobalLayoutListener()コールは、に電話すると、スクロール親が実際に測定され、システムによってレイアウトされるまで待って、その高さの実際の値を得ます。次に、それぞれの子ビューのLayoutParamsを必要な高さに更新します。

enter image description hereenter image description here

関連する問題