17

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

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

  • 上部に固定高さのヘッダー
  • EditText と Button を含む下部の入力領域
  • 残りのスペースをすべて使用する中間のコンテンツ部分

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

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

私の現在の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>

どんなヒントでも大歓迎です!

4

4 に答える 4

38

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

たとえば、1 行に 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 では最大サイズを指定することはできません。あなたができる最善の方法は、ScrollViewにlayout_weight = 1で固定サイズを与え、一番下のLinearLayoutにwrap_contentを伝えることだと思います。ScrollView が既にスペースを要求しているため、これにより (私が思うに) LinearLayout は拡張できなくなります。

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

于 2010-09-17T17:04:14.047 に答える
3

私は同様の問題を抱えていました (更新タイムスタンプが画面の下部に貼り付けられたフッターと、残りのすべてのスペースを占める 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 がクリッピングされず、すべての向きで完全に配置され、「リストは空です」というテキストが適切に表示されます。

于 2011-11-07T11:46:00.717 に答える
1

I believe you would be better off with a RelativeLayout. Add your header, and set it to layout_alignParentTop="true". Then add your EditText and Button, set that area to layout_alignParentBottom="true". Then, add the center area, set the width and height to fill_parent, and set layout_above="{the id of the EditText/Button layout}", and layout_below="{the id of the header layout}".

I don't have Eclipse at work, otherwise I would test it for you, but that should work.

于 2010-09-17T15:43:25.653 に答える
-1
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:weightSum="1"
>
<TextView
 android:text=" TextView " 
 android:textColor="#ffffff"
 android:textSize="15sp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="#ff0000"
 />
 <EditText
  android:text=" EditText " 
  android:textSize="15sp"
  android:layout_width="250dp"
  android:layout_weight="1"
  android:layout_height="0dp"
  />
 <Button
    android:text=" button " 
    android:textColor="#000000"
    android:textSize="15sp"
    android:gravity="center_vertical|center_horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
  </LinearLayout>

これは役に立ちます

于 2012-04-16T07:54:22.787 に答える