2012-10-31 18 views
23

Tôi muốn có biên mặc định cho EditText là 10dp. Do đó, trong tập tin styles.xml tôi thiết lập như sau:Android - lề được chỉ định theo kiểu tùy chỉnh không có hiệu lực

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 

    <style name="MyTheme" parent="android:style/Theme.NoTitleBar"> 
     <item name="android:editTextStyle">@style/edit_text_default</item> 
    </style> 

    <style name="edit_text_default" parent="android:style/Widget.EditText"> 
     <item name="android:layout_margin">10dp</item> 
    </style> 

</resources> 

Sau đó, trong AndroidManifest.xml, tôi đặt giao diện ứng dụng cho một trong tôi định nghĩa:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/MyTheme" > 
... 

Các "Không Title Bar "khía cạnh của chủ đề đang hoạt động. Tuy nhiên, lề mặc định cho EditText là không, nó vẫn còn điền vào phụ huynh. Đây là chế độ xem bảng của tôi:

<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" /> 
    </TableRow> 
    <TableRow> 
     <EditText android:hint="@string/first_name" /> 
    </TableRow> 
</TableLayout> 

Trả lời

48

trả lời ngắn: 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ã dưới đây). 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 bởi các chế độ xem để báo cho cha mẹ của chúng ViewGroup cách chúng muốn được trình bày. 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.

+4

W ... T ... F ?? tại sao? tại sao? TẠI SAO?!?! ... xin hãy tha thứ cho tôi ... tôi đang mất trí với tất cả những điều kỳ quặc về phát triển Android. – pbarranis

+0

Câu trả lời này hơi không đạt yêu cầu - các lề bố cục vẫn không được áp dụng ngay cả khi ViewGroup gốc và Chế độ xem con nằm trong cùng một tệp xml bố cục. Trong trường hợp này, inflater * biết * về loại bê tông của ViewGroup gốc (vì nó vừa thổi phồng nó) và cũng biết kiểu áp dụng (vì các thuộc tính kiểu khác được áp dụng). –

1

Bạn sử dụng đúng tên chủ đề trong Tệp kê khai của mình. Hãy thử thay đổi nó để:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/MyTheme" > 
+0

Xin lỗi, đó là lỗi đánh máy trong bài viết của tôi. Chúng giống nhau trong dự án thực tế của tôi. Đề xuất tốt mặc dù:/ – Groppe

0

Chỉ trong trường hợp nó hữu ích cho người khác, tôi muốn mang theo the answer by Oliv to another SO question tại đây. Tôi đã cố gắng thêm lề cho tất cả các nút và tìm thấy layout_margin không hoạt động.

Chủ đề:

<style name="FooThemeStyle" parent="Base.Theme.AppCompat"> 
    <item name="android:buttonStyle">@style/FooButton</item> 
    <item name="buttonStyle">@style/FooButton</item> 
</style> 

Nút phong cách:

<style name="FooButton" parent="Widget.AppCompat.Button"> 
    <item name="android:background">@drawable/button_background</item> 
</style> 

Đây là button_background.xml nơi the answer by Oliv to another SO question được sử dụng để thiết lập các quỹ để đảm bảo 2dp::

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:bottom="2dp" 
     android:left="2dp" 
     android:right="2dp" 
     android:top="2dp"> 
     <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
      ... 
     </selector> 
    </item> 
</layer-list> 
Các vấn đề liên quan