2012-03-17 44 views
28

Tôi có bố cục chứa hai ImageView. Tôi muốn một trong số họ được nhìn thấy trong bức chân dung và một trong cảnh quan. Làm thế nào để tôi đạt được nó bằng cách sử dụng tài nguyên? (Tôi biết làm thế nào để đặt nó theo chương trình cho nhưng việc sử dụng cụ thể này tôi cần để đạt được nó bằng cách sử dụng tài nguyên).Kiểm soát chế độ xem chế độ xem từ một tài nguyên

tôi đã cố gắng một cái gì đó giống như

trong res/layout/may_layout.xml:

... 
<ImageView 
     android:id="@+id/image1" 
     android:visibility="@integer/visible_in_portrait" <<-- is this allowed? 
     ... 
/> 
<ImageView 
     android:id="@+id/image2" 
     android:visibility="@integer/visible_in_landscape" 
     ... 
/> 

trong res/values ​​/ integers.xml:

... 
<!-- NOTE: 0 and 8 are VISIBLE and GONE respectively --> 
<integer name="visibile_in_portrait">0</integer> 
<integer name="visibile_in_landscape">8</integer> 

trong res/values-đất /integers.xml:

... 
<integer name="visibile_in_portrait">8</integer> 
<integer name="visibile_in_landscape">0</integer> 

B Tôi nhận được một lỗi thời gian chạy (chỉ số ra khỏi ràng buộc) khi cố gắng thổi phồng hình ảnh. Khi tôi xóa android: báo cáo hiển thị, chương trình sẽ chạy nhưng tôi thấy cả hai hình ảnh.

Hỏi: Cách sử dụng tài nguyên làm giá trị cho thuộc tính android: visibility là gì?

(nếu bạn tự hỏi tại sao cài đặt nó theo chương trình sẽ không giúp ích gì cho tôi, nó phải làm với chuyển đổi chân dung/chân dung tự động của tiện ích con ứng dụng bằng bitmap của tệp uri).

Trả lời

23

nó sẽ có thể khi bạn sử dụng thủ thuật này, thêm dòng hiển thị của bạn vào một phong cách và đặt hai trường hợp của tập tin đó trong chế độ địa phương và bình thường.

Ý tôi là trong tập tin trong thư mục styles.xmlvalues đặt một phong cách với tên s1, và đặt android:visibility=visible trong đó, và trong styles.xml trong thư mục values-land đặt một phong cách với tên s1, và đặt android:visibility=gone.

cũng có, trong tập tin trong thư mục styles.xmlvalues đặt một phong cách với tên s2, và đặt android:visibility=gone trong đó, và trong styles.xml trong thư mục values-land đặt một phong cách với tên s2, và đặt android:visibility=visible.

và sau đó, đặt s1 thành lần xem hình ảnh đầu tiên và s2 thành giây.

giải pháp do Calvin thân yêu cũng chính xác, nhưng khi bạn có bố cục phức tạp có thể thay đổi trong thời gian, có một tệp bố cục sẽ tốt hơn và ít cần phải thay đổi.

+0

Cảm ơn Keyhan, tôi sẽ thử và báo cáo ở đây. Cách tiếp cận này cũng sẽ giúp với câu hỏi này? http://stackoverflow.com/questions/9745227/setting-programmatically-the-pixel-size-of-a-remote-imageview. Tôi có 5 kích thước khác nhau lần hai chế độ (chân dung và langscape). Sử dụng kiểu cũng để kiểm soát kích thước ImageView? Bằng cách này, tôi sẽ có một bố trí duy nhất với hai hình ảnh và 5 cặp phong cách hướng/chân dung. (làm việc xung quanh những hạn chế của RemoteViews không phải là niềm vui ;-)). – user1139880

+0

Hoạt động tốt. Đây là một trợ giúp lớn!. Cảm ơn Keyhan. – user1139880

+0

Giải pháp được đề xuất liên quan đến việc sử dụng [Tài nguyên kiểu] (http://developer.android.com/guide/topics/resources/style-resource.html) – denispyr

0

Không thể thực hiện được. (Tôi đã thử định nghĩa fill_parent là chuỗi và sử dụng nó cho layout_width và nó cũng không thành công.)

Tại sao bạn không sử dụng 2 bố cục?

  1. res/layout/may_layout.xml
  2. res/layout-đất/may_layout.xml

nào từng xác định ImageView đúng để hiển thị.

Ngoài ra, việc có giá trị đất có thể gây ra sự cố khi bạn cần hỗ trợ đa ngôn ngữ. (Bạn sẽ cần phải có giá trị-xx-đất cho mỗi ngôn ngữ)

+1

Cảm ơn Calvin. Tôi đã cố gắng để tránh trùng lặp bố trí, trừ khi tôi có thể tạo chúng tự động từ một mẫu tại thời gian xây dựng. Không biết nếu eclipse hỗ trợ nó và làm thế nào nó sẽ được tiêu chuẩn. – user1139880

39

Đây là một câu hỏi cũ mà đã được chấp nhận, nhưng các giải pháp sau đây có thể giúp người khác:

Nếu bạn kiểm tra res/values ​​/ attrs.xml trong mã nguồn của Android, bạn sẽ thấy các định nghĩa của tài sản hiển thị như sau:

<!-- Controls the initial visibility of the view. --> 
    <attr name="visibility"> 
     <!-- Visible on screen; the default value. --> 
     <enum name="visible" value="0" /> 
     <!-- Not displayed, but taken into account during layout (space is left for it). --> 
     <enum name="invisible" value="1" /> 
     <!-- Completely hidden, as if the view had not been added. --> 
     <enum name="gone" value="2" /> 
    </attr> 

Thuộc tính này hy vọng giá trị chuỗi (hiển thị, ẩn, đi) sẽ được chuyển thành (0, 1, 2) tương ứng. Vì vậy, bạn có thể khai báo các nguồn nguyên liệu có chứa các giá trị như thế này:

giá trị/integers.xml

<integer name="visible_in_portrait">2</integer> <!-- This is GONE --> 

giá trị đất/integers.xml

<integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE --> 

Tuy nhiên, nếu bạn muốn thực hiện thậm chí tốt hơn nữa để ngừng đoán các hằng số số này mỗi lần, bạn có thể làm như sau:

giá trị/integers.xml

<!-- These are alias for the constants we'll reference below --> 
<integer name="view_visible">0</integer> <!-- This is VISIBLE --> 
<integer name="view_invisible">1</integer> <!-- This is INVISIBLE --> 
<integer name="view_gone">2</integer> <!-- This is GONE --> 

<integer name="visible_in_portrait">@integer/view_gone</integer> <!-- We're referencing the visibility alias we declared above --> 

giá trị đất/integers.xml

<integer name="visible_in_landscape">@integer/view_visible</integer> 

Bạn có thể sử dụng phương pháp này hoặc một trong những đề xuất bởi Keyhan. Chọn một trong những phù hợp với bạn tốt hơn.

+5

Nó cũng hoạt động tuyên bố chúng là '' thay vì '' – TalkLittle

+0

thực hành tốt là giữ các giá trị android ban đầu để hiển thị, ẩn và đi (không 0, 1, 2, nhưng 0, 4, 8) –

+3

, đó không phải là exaclty cách nó hoạt động. Nếu bạn kiểm tra mã lớp 'View', các giá trị này (0, 1 và 2) được sử dụng để truy cập vào các vị trí của thành viên này:' private static final int [] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE}; '. Đó là lý do tại sao bạn không thể sử dụng 0, 4 và 8, vì 0, 1 và 2 đứng cho các chỉ số VISIBLE, INVISIBLE và GONE. –

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