2010-09-17 3 views
16

tôi thực sự cố gắng, nhưng tôi không thể hiểu làm thế nào giải thích Android layout_weight thiết lập ...vấn đề tìm hiểu XML Android layout_weight

Những gì tôi đang cố gắng để đạt được là

  • một tiêu đề trên với chiều cao cố định
  • một khu vực đầu vào ở dưới cùng chứa một EditText và một nút
  • một phần nội dung ở giữa đó là tham gia tất cả những gì còn lại của không gian

Khi nhập, tôi muốn phát triển EditText thành chiều cao cụ thể và bắt đầu cuộn nếu văn bản được nhập vượt quá chiều cao có sẵn. Làm điều này tôi cần xung quanh LinearLayout để phát triển cùng với EditText.

Nếu tôi xác định chiều cao cụ thể cho bên trong LinearLayout, nó sẽ không phát triển. Nếu không, bố cục bên trong sẽ TẤT CẢ không gian thay vì ScrollView, bất kể tôi thử sử dụng gì layout_weight. :(

XML hiện tại của tôi trông như thế:

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

Bất cứ lời khuyên được đánh giá rất

Trả lời

37

layout_weight được sử dụng để xác định cách Android phân chia mọi dung lượng còn lại sau khi các tiện ích khác nhau nhận được tất cả dung lượng mà chúng muốn.

Vì vậy, giả sử bạn có 3 tiện ích con trong một hàng, mỗi tiện ích con trong số đó muốn có 10 pixel, nhưng bạn có dung lượng không gian là 50 pixel. Dưới đây là một vài ví dụ về layout_weights và số pixel mà mỗi tiện ích con sẽ xác nhận quyền sở hữu:

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 

Bạn có thể nghĩ trọng lượng theo phần trăm không gian có sẵn. Nó sẽ thêm tất cả các giá trị, và sau đó đưa ra các phần thích hợp. Do đó, nếu nó giúp bạn có thể sử dụng trọng lượng mà thêm đến 100 để làm tỷ lệ:

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

Nếu tôi hiểu đúng, bạn muốn widget dưới để bắt đầu từ một kích thước cụ thể, sau đó mở rộng ra một số kích thước tối đa nếu cần thiết và sau đó cuộn.

Và, bạn muốn tiện ích ở trên nó chiếm toàn bộ không gian thừa.

Thật không may trong Android nó không thực sự có thể xác định kích thước tối đa. Tôi nghĩ rằng tốt nhất bạn có thể làm là để cho ScrollView một số kích thước cố định, với layout_weight = 1 và cho LinearLayout dưới cùng là wrap_content. Điều này sẽ (tôi nghĩ) khiến LinearLayout mở rộng cho đến khi nó không thể nữa, bởi vì ScrollView đã tuyên bố không gian.

Tuy nhiên, challange đang chỉ định kích thước cố định cho ScrollView có ý nghĩa ở tất cả các kích thước và độ phân giải màn hình khác nhau. Bạn có thể sẽ phải tạo các bố cục khác nhau cho các độ phân giải khác nhau, điều này có thể không đáng giá. Cá nhân, tôi chỉ cung cấp cho editText một kích thước cố định ...

+0

Cảm ơn Mayra. Đó là chính xác những gì tôi cố gắng làm. Có lẽ kcoppock có một ý tưởng khác. Nếu nó phải là tôi sẽ kết thúc việc tạo bố trí cho các giải pháp khác nhau. :(Thiết lập ScrollView đến một kích thước cụ thể VÀ thêm layout_weight = 1 sẽ làm cho ScrollView mất tất cả không gian nó có thể nhận được và "thu nhỏ" thành kích thước được xác định ngay sau khi một số widget khác chiếm nhiều không gian hơn, phải không? – stpn108

+2

Yup, thats ý tưởng –

+1

Nghe đúng.Tôi tin rằng có một thuộc tính setMultiLine cho EditTexts. Nếu bạn thiết lập điều đó, và thiết lập chiều cao là wrap_content, tôi khá chắc chắn nó sẽ mở rộng để phù hợp, và thu nhỏ ScrollView cho phù hợp. – kcoppock

1

Tôi tin rằng bạn sẽ được tốt hơn off với một RelativeLayout Thêm tiêu đề của bạn, và đặt nó vào layout_alignParentTop="true"!. . Sau đó thêm EditText và Button của bạn, thiết lập khu vực đó để layout_alignParentBottom="true". Sau đó, thêm các khu vực trung tâm, thiết lập chiều rộng và chiều cao để fill_parent, và thiết lập layout_above="{the id of the EditText/Button layout}", và layout_below="{the id of the header layout}".

Tôi không có Eclipse trong công việc, nếu không tôi sẽ thử nghiệm nó cho bạn, nhưng điều đó sẽ làm việc.

+0

Thanks a lot, kcoppock! Tôi sẽ kiểm tra điều đó trong vòng một hoặc hai giờ và cho bạn biết liệu nó có hoạt động hay không. – stpn108

+0

Hm, nó thực sự không thay đổi gì cả. Chỉ có tiêu đề biến mất. ;) Nếu tôi sử dụng LinearLayout một lần nữa tiêu đề quay trở lại. Tôi giữ 'layout_alignParentTop = "true"' và 'layout_alignParentBottom = "true"' như bạn đã gợi ý. Ngay sau khi tôi đặt bên trong 'LinearLayout' thành 'layout_height = "wrap_content"' nó sẽ chiếm một nửa màn hình. Ngoài ra, tôi không hiểu tại sao EditText mất 80% chiều rộng trong LinearLayout vì nó được định nghĩa là có 'layout_weight = "0.2"'. Nhưng đó không phải là câu hỏi ở đây ...;) – stpn108

+0

Bạn có thể đăng những gì bạn đã thử vào một liên kết pastebin.com không? Hoặc chỉ cần chỉnh sửa nó vào bài đăng gốc? Tôi có thể xem nó và xem có bất cứ điều gì nhảy ra ngoài không. Oh, ngoài ra, trọng lượng bố trí nên chỉ là số nguyên tôi tin. Nếu tôi nhớ lại chính xác, tất cả các layout_weights được xác định sẽ thêm tối đa 10. Vì vậy, trọng số của 2 là 20%. Tôi có thể sai về điều đó mặc dù. – kcoppock

3

Tôi đã gặp sự cố tương tự (chân trang có dấu thời gian làm mới gắn vào cuối màn hình và một ListView/ScrollView chiếm hết tất cả không gian) và sau nhiều cố gắng nó làm việc cho tôi bằng cách sử dụng bố trí như sau:

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

Không cắt ListView khi với một cuộn, sự liên kết hoàn hảo trong mọi phương hướng, thể hiện đúng "danh sách rỗng" text.

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

Điều này sẽ giúp

+0

không có hành vi phạm tội, có lẽ tôi chỉ không nhận được những gì bạn đang cố gắng để làm với XML này, nhưng tôi không thể thấy làm thế nào điều này sẽ giúp với vấn đề ban đầu. bạn có thể làm rõ một chút? – stpn108