web-dev-qa-db-ja.com

理解の問題Android XML layout_weight

私は本当にしようとしましたが、Androidがlayout_weight設定をどのように解釈するのか理解できません...

私が達成しようとしているのは

  • 高さが固定された上部のヘッダー
  • editTextとボタンを含む下部の入力領域
  • スペースの残りをすべて取っている中央のコンテンツ部分

入力するときに、EditTextを特定の高さに拡大し、入力したテキストが使用可能な高さを超えた場合にスクロールを開始したいと思います。これを行うには、EditTextと一緒に成長するために周囲のLinearLayoutが必要です。

内側のLinearLayoutに特定の高さを定義すると、それは大きくなりません。そうしないと、layout_weightを何に使用しようとしても、内部レイアウトはScrollViewではなくすべてのスペースを使用します。 :(

私の現在のXMLは次のようになります。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >
    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="I'm a header" />
    <ScrollView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_weight="1"
        Android:gravity="bottom">
        <LinearLayout
            Android:id="@+id/itemContainer"
            Android:orientation="vertical"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content" />
    </ScrollView>
    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="50dp"
        Android:padding="2dp"
        Android:gravity="bottom"
        Android:isScrollContainer="true"
        Android:background="@drawable/steel" >
        <EditText
            Android:id="@+id/edittext01"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="0.2"
            Android:scrollbars="vertical"
            Android:fadingEdge="vertical"
            Android:fadingEdgeLength="60dp"
            Android:maxHeight="40dp"
            Android:textSize="15sp" />
        <Button
            Android:id="@+id/button"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="0.8"
            Android:layout_gravity="right"
            Android:text="Send"
            Android:textStyle="bold"
            Android:textSize="15sp" />
    </LinearLayout>
</LinearLayout>

ヒントは大歓迎です!

17
Dennis Winter

layout_weightは、さまざまなウィジェットが必要なすべてのスペースを取得した後、Androidが残りのスペースをどのように分割するかを決定するために使用されます。

つまり、3つのウィジェットが連続していて、それぞれが10ピクセルを必要としているが、50ピクセル相当のスペースがあるとします。以下は、layout_weightsと各ウィジェットが要求するピクセル数の例です。

widget1: weight = 1, 30px
widget2: weight = 0, 10px
widget3: weight = 0, 10px

widget1: weight = 1, 20px
widget2: weight = 1, 20px
widget3: weight = 0, 10px

widget1: weight = 1, 16.5px
widget2: weight = 1, 16.5px
widget3: weight = 1, 16.5px

重量は、使用可能なスペースのパーセンテージと考えることができます。すべての値を合計してから、必要に応じて部分を割り当てます。したがって、それが役立つ場合は、合計100までの重みを使用してパーセンテージを実行できます。

widget1: weight = 0, 10px
widget2: weight = 25, 15px
widget3: weight = 75, 25px

私が正しく理解している場合は、下部のウィジェットを特定のサイズから開始し、必要に応じて最大サイズに拡大してからスクロールする必要があります。

そして、その上のウィジェットが余分なスペースをすべて占有するようにします。

残念ながら、Androidでは、最大サイズを指定することは実際には不可能です。あなたができる最善の方法は、layout_weight = 1でScrollViewに固定サイズを指定し、下部のLinearLayoutに次のように指示することです。 wrap_content。これにより、(私が思うに)ScrollViewがすでにスペースを要求しているため、LinearLayoutが拡張できなくなるまで拡張されます。

ただし、課題は、すべての異なる画面サイズと解像度で意味のあるScrollViewの固定サイズを指定しています。解像度ごとに異なるレイアウトを作成しなければならない場合がありますが、これはおそらく価値がありません。個人的には、editTextに固定サイズを指定します...

37
Cheryl Simon

同様の問題が発生し(更新タイムスタンプが画面の下部に表示され、ListView/ScrollViewが残りのスペースをすべて占有するフッター)、何度も試行した後、次のレイアウトを使用して機能しました。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" 
            Android:layout_width="match_parent" 
            Android:layout_height="match_parent">

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:layout_width="fill_parent"
              Android:layout_height="fill_parent" 
              Android:layout_above="@+id/refresh_date_text" 
              Android:layout_alignParentTop="true"
              Android:orientation="vertical" 
              >

    <ListView Android:id="@Android:id/list" Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" Android:background="#FFFFFF"
        Android:layout_weight="1" Android:divider="@drawable/list_divider"
        Android:dividerHeight="1dp" Android:drawSelectorOnTop="false" />

    <TextView Android:id="@Android:id/empty"
              Android:layout_width="match_parent"
              Android:layout_height="match_parent"
              Android:background="#ffffff"
              Android:gravity="center_horizontal"
              Android:paddingTop="10dp"
              Android:text="The list is empty."/>

</LinearLayout>

<TextView Android:id="@+id/refresh_date_text"
          Android:layout_width="match_parent" 
          Android:layout_height="wrap_content" 
          Android:layout_alignParentBottom="true"
          Android:gravity="center_horizontal" 
          Android:background="#f0f0f0" 
          Android:textStyle="italic" 
          Android:textSize="12dp"
          />
</RelativeLayout>

スクローラーを使用している場合、ListViewをクリッピングせず、すべての方向で完全に配置され、「リストが空です」というテキストが適切に表示されます。

3
javaxian

私はあなたがRelativeLayoutを使うほうがよいと信じています。ヘッダーを追加し、layout_alignParentTop="true"に設定します。次に、EditTextとButtonを追加し、その領域をlayout_alignParentBottom="true"に設定します。次に、中央の領域を追加し、幅と高さをfill_parentに設定し、layout_above="{the id of the EditText/Button layout}"、およびlayout_below="{the id of the header layout}"を設定します。

Eclipseは動作していません。そうでない場合はテストしますが、動作するはずです。

1
Kevin Coppock