2010-09-23 17 views
28

Tôi đã sử dụng thuộc tính layout_marginLeft="30dip" theo kiểu được xác định cho các nút. Khi tôi áp dụng kiểu này riêng lẻ cho mỗi nút, lề trái được đặt như tôi muốn.Để sử dụng layout_marginLeft theo kiểu nút được áp dụng làm chủ đề?

Nhưng sau đó tôi đã xác định chủ đề, trong đó tôi đã gán kiểu nút cho thuộc tính android:buttonStyle và áp dụng nó cho dự án của mình.
Tuy nhiên, thuộc tính lề trái bị bỏ qua. Bất kỳ ý tưởng những gì tôi phải làm ở đây?

style.xml như sau:

<style name="btnstyle" parent="@android:style/Widget.Button"> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_marginLeft">30dip</item> 
    <item name="android:textColor">#FFFFFF</item>  
</style> 

<style name="appstyle" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/btnstyle</item> 
</style> 

Trả lời

3

Bao giờ nhận được để dưới cùng của điều này? Tôi đang gặp vấn đề tương tự; tất cả các thuộc tính lề được bỏ qua khi áp dụng cho một Button hoặc ImageButton thông qua một kiểu trong một chủ đề.

Tuy nhiên, tôi đã tìm thấy nó không hoạt động khi kiểu được áp dụng trực tiếp bằng thuộc tính "kiểu" trên nút. Dường như lợi nhuận không phải là một phần của thông số "buttonStyle".

+0

tốt, tôi được quản lý với một workaround. Thay vì đặt lề, tôi chỉ xác định nút bên dưới thuộc tính. ví dụ: chỉ định button2, 3 và 4 được căn chỉnh bên dưới button1 chẳng hạn. Tôi không tìm được cách nào khác. – kiki

2

Tôi đoán đây là lỗi trong Android.

Mặt khác, khi tôi bắt đầu sử dụng kiểu, tôi đặt mọi thứ bên trong kiểu. Tôi nhận thấy rằng tôi đã tạo ra một phong cách cho mọi widget. Ngay bây giờ, tôi đặt các thuộc tính vị trí bên trong một kiểu.

Vì vậy, width, height, paddinglayout thuộc tính trong phần tử XML và phần còn lại của các thuộc tính bên trong kiểu.

+1

Đây là một lỗi trong khung android. thuộc tính layout_margin * được bỏ qua trong các kiểu nếu chúng là chủ đề được tham chiếu. – Anderson

+0

Điều này thật đáng sợ. layout_marginRight và marginLeft không bị bỏ qua. Tuy nhiên trên và dưới được bỏ qua. –

10

Có một câu trả lời tuyệt vời here on stackoverflow. Về cơ bản, LayoutParams (layout_) được sử dụng cho các chế độ xem con để báo cho cha mẹ của chúng ViewGroup cách chúng được định vị. Nhưng LayoutParams dành riêng cho từng loại ViewGroup (LinearLayout, RelativeLayout, FrameLayout, v.v.) vì vậy, không thể khái quát hóa LayoutParams theo cách này cho một chủ đề.

Tất cả điều này là rất đáng tiếc là bạn không thể sử dụng phong cách hoàn toàn tổng quát trong một chủ đề nhưng bạn vẫn có thể sử dụng phong cách cho mỗi điểm cụ thể nơi bạn cần đến nó, như sau:

<Button style="@style/btnstyle"/> 
+0

Các nút có lề theo mặc định như thế nào? Khung làm việc như thế nào? – Nilzor

+1

Các nút @Nilzor không có lề, chúng có grafic đã được xây dựng ở lề/đệm. Kiểm tra thư mục tài nguyên và bạn sẽ thấy. nếu bạn thiết lập đồ họa nền cho một cái gì đó khác các nút sẽ không có bất kỳ lề – Warpzit

+0

Cảm ơn. Vì vậy, tôi đoán đó là một cách tiếp cận bất cứ ai thiết kế nút riêng của họ có thể mất là tốt. – Nilzor

13

Dường như điều này có thể đạt được bằng cách gói một thẻ insets xung quanh hình dạng.

Như thế này:

<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetLeft="5dp" 
    android:insetRight="5dp" 
    android:insetTop="5dp" 
    android:insetBottom="5dp"> 

<shape 
    android:shape="rectangle"> 
    <solid 
     android:color="#fff"/> 
    <stroke 
     android:width="1dp" 
     android:color="#333"/> 
    <corners 
     android:radius="10dp"/> 
</shape> 
</inset> 
+0

sau nhiều lần thử này là chỉ có tác phẩm đối với tôi, cảm ơn. – kometonja

0

ngắn Trả lời: Nếu bạn đang xác định layout_margin trong một phong cách tùy chỉnh, phong cách này phải được áp dụng một cách rõ ràng cho mỗi điểm cá nhân mà bạn muốn có biên độ quy định (như đã thấy trong mẫu mã bên dưới). Bao gồm phong cách này trong một chủ đề và áp dụng nó vào ứng dụng của bạn hoặc một hoạt động sẽ không hoạt động.

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF" > 
    <TableRow> 
     <EditText android:hint="@string/last_name" style="@style/edit_text_default" /> 
    </TableRow> 
    <TableRow> 
     <EditText android:hint="@string/first_name" style="@style/edit_text_default" /> 
    </TableRow> 
</TableLayout> 

Giải thích: Thuộc tính bắt đầu bằng layout_LayoutParams, hoặc một trong các lớp con của nó (ví dụ MarginLayoutParams). LayoutParams được sử dụng theo lượt xem để nói với cha mẹ của họ ViewGroup cách họ muốn được sắp xếp.Mỗi và mọi lớp ViewGroup triển khai lớp lồng nhau mở rộng ViewGroup.LayoutParams. Do đó, LayoutParams dành riêng cho loại của ViewGroup. Điều này có nghĩa là trong khi TableLayoutLinearLayout cả hai có thể có layout_margin là một trong số đó là LayoutParams, chúng được xem là thuộc tính hoàn toàn khác nhau.

Vì vậy, layout_margin không chỉ là thuộc tính chung có thể được áp dụng ở bất kỳ đâu. Nó phải được áp dụng trong bối cảnh của một ViewGroup xác định cụ thể nó như một đối số hợp lệ. Chế độ xem phải là nhận biết loại của phụ huynh ViewGroup khi áp dụng LayoutParams.

Chỉ định layout_margin theo kiểu, bao gồm kiểu đó trong chủ đề và cố gắng áp dụng chủ đề đó cho ứng dụng/hoạt động sẽ dẫn đến thuộc tính bố cục bị giảm, vì không có bố cục ViewGroup nào được chỉ định và do đó đối số không hợp lệ. Tuy nhiên, áp dụng kiểu dáng cho chế độ xem EditText đã được xác định bằng một công việc TableLayout, vì phụ huynh ViewGroup (số TableLayout) được biết.

Nguồn:

tài liệu Android trên Layout Parameters.

Câu trả lời được đưa ra cho this question bởi kỹ sư khung Android và người dùng StackOverflow adamp.

Ngoài ra, câu trả lời được cung cấp cho this question bởi người dùng StackOverflow inazaruk.

Tôi không muốn bất kỳ tín dụng của câu trả lời này các anh hùng thực là ở đây - https://stackoverflow.com/a/13365288/4741746

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