Tôi nhận ra điều này có lẽ là một câu hỏi bố trí tầm thường, nhưng tôi dường như không thể có được nó làm việc theo cách tôi muốn mà không layering trong những gì tôi cảm thấy là quá nhiều bố cục container. Những gì tôi đang cố gắng làm là thiết lập một ImageView sao cho các điều kiện sau đây được thỏa mãn:ImageView Android có kích thước tính theo trọng lượng không tập trung ở mẹ LinearLayout
- Chiều rộng của ImageView là một số phần trăm nhất định chiều rộng của bố mẹ (chiều rộng màn hình hiện tại).
- ImageView được căn giữa theo chiều ngang trong màn hình.
Tôi đã tạo một trường hợp thử nghiệm bằng cách sử dụng bố cục XML, nhưng trong thực tế, tôi sẽ tạo các bố cục và chế độ xem theo chương trình; Tôi không nghĩ rằng điều này quan trọng cho các mục đích của việc tìm ra cách bố trí chính xác mặc dù.
Tôi hơi quen thuộc với trọng số trong bố cục Android và cách chúng thường được sử dụng để bố trí nhiều chế độ xem với các yếu tố trọng số tương đối. Để thỏa mãn điều kiện 1, tôi tạo một LinearLayout chứa (định hướng nằm ngang), thiết lập weightSum = 1, sau đó nhúng ImageView của tôi với trọng số của bất cứ phần trăm nào tôi muốn, nói 0.5. Những công việc này!
Tiếp theo, tôi muốn ImageView kết thúc ở giữa màn hình theo chiều ngang. Vì vậy, tôi đặt trọng lực thành "center"/"centerHorizontal". Đây là nơi tôi đang mắc kẹt, bởi vì không có vấn đề gì các thiết lập trọng lực/layout_gravity tôi chọn nó dường như luôn luôn sắp xếp ở phía bên trái.
tập tin Layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<ImageView
android:src="@drawable/earth"
android:adjustViewBounds="true"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_gravity="center_horizontal"
android:id="@+id/imageView1" />
</LinearLayout>
</LinearLayout>
Kết quả:
Những gì tôi thực sự muốn đạt được một cái gì đó như thế này là:
Nhưng để đạt được đó, tôi phải chèn hai LinearLayouts giả với trọng lượng 0,25 ở hai bên của ImageView tôi như vậy:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<LinearLayout
android:orientation="horizontal"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.25"/>
<ImageView
android:src="@drawable/earth"
android:adjustViewBounds="true"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_gravity="center_horizontal"
android:id="@+id/imageView1" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.25"/>
</LinearLayout>
</LinearLayout>
Đây là một bố cục xấu xí và vụng về trong quan điểm của tôi, không chỉ bởi vì bây giờ tôi cần phải sử dụng 3 LinearLayouts thêm ngoài LinearLayout cấp cao nhất của tôi chỉ kích thước và định vị chế độ xem của tôi, nhưng cũng bởi vì tôi muốn thực hiện tất cả bố cục theo chương trình và động. Tôi có thể quyết định chỉnh sửa các khung nhìn của mình ngay khi chạy hoặc thay đổi hệ số tỷ lệ tương ứng với chiều rộng màn hình, trong giải pháp này yêu cầu có khả năng thêm/xóa các bố cục giả và thiết lập tất cả các trọng số một cách thích hợp.
tôi hy vọng rằng ai đó tốt hơn ở bố trí hơn tôi sẽ có một giải pháp tốt hơn! Lý tưởng nhất là một cái gì đó mà tôi chỉ có thể đặt "lực hấp dẫn" (mặc dù tôi không thể làm việc đó), hoặc một số cách khác để thiết lập chiều rộng mà không cần container LinearLayout và trọng lượng ngang, vì không có container theo chiều ngang trong LinearLayout dọc cấp cao nhất của tôi.
Cảm ơn!
EDIT: Tôi vừa nhận ra rằng trong lần thử bố cục thứ hai của tôi bằng cách sử dụng LinearLayouts đệm giả mà tôi có thể thực hiện với LinearLayout đệm thứ hai (được đặt thành trọng số là 0.25) và chỉ sử dụng một LinearLayout đệm giả trước ImageView của tôi, vì chúng liên quan đến weightSum định trước trong parent. Ví dụ:
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<LinearLayout
android:orientation="horizontal"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.25"/>
<ImageView
android:src="@drawable/earth"
android:adjustViewBounds="true"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_gravity="center_horizontal"
android:id="@+id/imageView1" />
</LinearLayout>
Vẫn không phải là giải pháp lý tưởng mà tôi mong đợi.
có thể là 'center_horizontal'? – gunar
@gunar, nope, center_horizontal không hoạt động. Như tôi mong đợi từ cha mẹ của ImageView là một trung tâm LL nằm ngang chỉ theo hướng thẳng đứng. – Camputer
không cần thiết vì chiều cao linearlayout đã được đặt thành android: layout_height = "wrap_content" – Simo