2016-03-16 15 views
5

Tôi có một TextView và một hình vuông ImageView mà tôi muốn hiển thị theo bố cục tuyến tính ngang. Mỗi quảng cáo phải chiếm một nửa chiều rộng của chế độ xem gốc và chiều cao phải phù hợp với nội dung (ví dụ: hình ảnh). Văn bản phải được căn giữa theo chiều dọc.Bố cục ngang linh hoạt với `layout_weight` và` maxWidth`

Hạn chế bổ sung là hình ảnh không được phát triển vượt quá maxWidth (= maxHeight) nhất định và chiều rộng dư thừa phải được cung cấp cho TextView. Rõ ràng, điều này mâu thuẫn với quy tắc 50/50 ở trên. Có cách nào để ưu tiên các ràng buộc, tức là cho phép hình ảnh chiếm một nửa không gian trừ khi nó vượt quá một kích thước nhất định?

desired outcome

Đây là những bố trí tôi đã cố gắng:

Người đầu tiên độc đáo trải dài phía bên trái để không gian có sẵn. Tuy nhiên, hình ảnh mất hơn một nửa chiều rộng vì nó không được chỉ định (như trong hình dưới đây).

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:gravity="center_vertical"> 
     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Some text."/> 
    </LinearLayout> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:maxWidth="200dp" 
     android:adjustViewBounds="true" 
     android:src="@drawable/image" /> 
</LinearLayout> 

without <code>layout_weight</code>

Khi tôi thêm layout_weight đến ImageView nó luôn luôn có một nửa chiều rộng và bỏ qua (hình ảnh xem dưới đây) maxWidth.

<ImageView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:maxWidth="200dp" 
     android:adjustViewBounds="true" 
     android:src="@drawable/image" /> 

with <code>layout_weight</code>

Đưa các ImageView trong LinearLayout khác cho phép maxWidth một lần nữa, nhưng kèm theo LinearLayout vẫn mất một nửa của không gian có sẵn (xem hình dưới đây).

<LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="right"> 

     <ImageView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:maxWidth="200dp" 
      android:adjustViewBounds="true" 
      android:src="@drawable/image" /> 
    </LinearLayout> 

using enclosing <code>LinearLayout</code>

Một tùy chọn khác Tôi đã tìm thấy cho similar scenarios là sử dụng một RelativeLayout với một cái nhìn vô hình như một chia trung tâm, nhưng mà khóa bộ phận để 50/50 (hoặc bất cứ nơi nào chia được đặt) .

+0

'TextView' điền vào màn hình khác và tất cả đều dễ dàng .. điều kiện xung đột trong đó mỗi' Chế độ xem' (* TextView và ImageView *) chiếm một nửa chiều rộng của cha mẹ làm cho nó khó khăn .. –

Trả lời

2

Được rồi, sẽ đi về phía trước và gửi xml tôi tạo ra, nó khá đơn giản, nó hầu hết điều kiện của bạn .. Một điều tôi đang gặp rắc rối với là phần mà mỗi lượt xem chiếm một nửa chiều rộng của chế độ xem gốc. Hy vọng điều này vẫn giúp bạn trong một số cách.

sample_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="2dp" 
    android:background="@android:color/darker_gray"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/img_sample" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginRight="2dp" 
     android:layout_toLeftOf="@id/img_sample" 
     android:background="@color/colorPrimary" 
     android:gravity="center_vertical" 
     android:text="Some text." /> 

    <ImageView 
     android:id="@id/img_sample" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginLeft="2dp" 
     android:adjustViewBounds="true" 
     android:maxWidth="200dp" 
     android:src="@drawable/sample_img" /> 

</RelativeLayout> 

Đây là một ảnh chụp màn hình mẫu: enter image description here

Nếu bao giờ bạn tìm ra cách để các nửa của mỗi điều, bình luận vui lòng nó ở đây, Nó sẽ được tốt đẹp để biết về nó để sử dụng trong tương lai có thể.:)

PS: Bạn đã cân nhắc thực hiện một nửa của mỗi điều theo chương trình? Giống như kiểm tra LayoutParams, sau đó thiết lập động weightSumlayout_weight s.

Sample Image lấy từ này link

+1

Cảm ơn bạn đã nỗ lực và minh họa tuyệt vời. Bạn đã quản lý để đơn giản hóa ví dụ đầu tiên của tôi với cùng một kết quả. Điều đó tôi có thể trực tiếp áp dụng. Nhưng, như bạn đã lưu ý, nó không đáp ứng đầy đủ các yêu cầu. Cách tôi giải quyết nó bây giờ là tránh vấn đề bằng cách tạo các khung nhìn khác nhau cho cảnh quan và chân dung. Đúng, nó cũng có thể được thực hiện theo chương trình. Tôi có thể có những kỳ vọng sai lầm. :) – jerry

+1

Trừ khi ai đó đến với một cách xml làm điều này tôi nghi ngờ rằng xử lý nó lập trình thực sự là câu trả lời đúng: thiết lập 'layout_weight' của' ImageView'if chiều rộng của container vượt quá hai lần 'maxWidth'. Tôi sẽ cung cấp cho nó một vài ngày trước khi tôi đặt dấu kiểm. – jerry

+1

@jerry Đừng lo. Chúc may mắn. :) Nhiều nhất có thể, tôi cũng muốn xem một triển khai thông qua xml chỉ, có thể sử dụng nó một ngày nào đó.: D –

0
<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <ImageView 
     android:id="@id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentTop="true" 
     android:layout_weight="1" 
     android:adjustViewBounds="true" 
     android:background="@color/blue" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentStart="true" 
     android:layout_centerVertical="true" 
     android:layout_margin="5dp" 
     android:layout_toStartOf="@id/imageView" 
     android:background="@color/colorPrimary" 
     android:padding="10dp" 
     android:text="Some text. " /> 
</RelativeLayout> 

Here's what it looks like

+0

Hmm, nhưng thực sự có chỉ là một trường hợp. Bố cục phải thích ứng với chiều rộng của chế độ xem của phụ huynh. – jerry

+0

Hãy thử sử dụng RelativeLayout làm cha mẹ, sau đó cho xem hình ảnh của bạn đã cho nó một layout_weight = 1, alignparentRight = true. – user142020a

+0

Ban đầu tôi đã sử dụng bố cục Tương đối với ngăn chia ẩn 'Xem' như được mô tả trong câu trả lời tôi đã liên kết đến. Điều này đã cho kết quả tương tự như lần thử thứ 3 của tôi. Tôi bắt đầu từ đó, loại bỏ dải phân cách và áp dụng 'Layout_weight = 1' và' alignParentRight = true'. Có thể có điều gì đó sai, nhưng hình ảnh hiện nay chiếm gần như toàn bộ chiều rộng với các lề bằng nhau trên cả hai mặt, bao trùm cả văn bản. Kích thước có thể bị giới hạn bởi kích thước của chính hình ảnh đó. – jerry

0

Nó sẽ không thể là một giải pháp hoàn hảo về mặt hiệu suất. Nhưng bạn có thể đạt được nó bằng cách chơi với FrameLayout và ImageView.

Đây là kết quả: enter image description hereenter image description here

Layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/textGray" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@color/skyBlue"> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 

      <FrameLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:background="@android:color/white"> 

       <ImageView 
        android:id="@+id/imageView4" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxWidth="200dp" 
        android:src="@drawable/ic_settings" 
        android:visibility="invisible" /> 

       <TextView 
        android:id="@+id/TextView" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:layout_gravity="center" 
        android:text="!" /> 
      </FrameLayout> 

      <ImageView 
       android:id="@+id/imageView2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:maxWidth="200dp" 
       android:src="@drawable/ic_settings" /> 
     </LinearLayout> 
    </FrameLayout> 
</LinearLayout> 

Để đạt được hành vi mong muốn, Bạn sẽ phải thiết lập cùng một hình ảnh để cả imagesviews trong bố cục này. một trong số đó là invisble, Nó chỉ là giúp làm cho cha mẹ với cùng chiều rộng và chiều cao mà sẽ dẫn chúng ta để tạo TextView với kích thước tương tự.
Lưu ý:Nếu bạn muốn thay đổi căn chỉnh TextView, bạn có thể làm điều đó với layout_gravity hoặc trọng lực.

+0

Cảm ơn bạn. Đó là một cách tiếp cận thú vị. Tôi đã bỏ mã của bạn trực tiếp vào chế độ xem của tôi - chỉ thay đổi tên màu và hình ảnh. Hai vấn đề: 1. Phần văn bản không mở rộng khi có chỗ cho nó (nó phải mất hơn 50%). 2. Sử dụng hình ảnh lớn hơn, chiều cao của toàn bộ nhóm được đặt theo kích thước hình ảnh nguồn trong khi chiều rộng của mỗi bên vẫn là 50%. – jerry

+0

1. bạn có thể đạt được hành vi đó bằng cách chơi với độ lớn của chế độ xem văn bản và chế độ xem của bố cục. 2. chúng tôi đang sử dụng maxWidth = 200dp cho imageView. nếu bạn thêm giá trị maxHeight, nó sẽ không mở rộng đến chiều cao đầy đủ. –

+0

@jerry: Mẫu đó cung cấp cho bạn ý tưởng để đạt được chức năng được yêu cầu. Tôi sẽ đề nghị bạn chơi với nó và sửa đổi nó theo yêu cầu. Happy Coding :) –

Các vấn đề liên quan