私は本当にしようとしましたが、Androidがlayout_weight
設定をどのように解釈するのか理解できません...
私が達成しようとしているのは
入力するときに、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>
ヒントは大歓迎です!
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に固定サイズを指定します...
同様の問題が発生し(更新タイムスタンプが画面の下部に表示され、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をクリッピングせず、すべての方向で完全に配置され、「リストが空です」というテキストが適切に表示されます。
私はあなたが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は動作していません。そうでない場合はテストしますが、動作するはずです。