2013-01-24 30 views
13

Mã sau đây là để hiển thị nút tùy chỉnh trong Android. Thật không may, tất cả các giá trị đệm ở những vị trí khác nhau đều ảnh hưởng đến cách nút được hiển thị chỉ dành cho Android 2.3, nhưng trên Android 4.X nó không có hiệu lực, tức là phần đệm luôn giống nhau, bất kể bạn đặt gì ở đây. Tại sao?Nút tùy chỉnh với nền có thể kéo: Sự khác biệt về đệm trong Android 4 so với Android 2.3

Cách bố trí XML:

<Button 
    android:id="@+id/sample_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/button_caption" 
    android:padding="6dp" 
    android:layout_marginBottom="6dp" 
    android:layout_marginRight="6dp" 
    style="@style/CustomButton" 
    android:textSize="16sp" /> 

Phong cách:

<style name="CustomButton"> 
    <item name="android:layout_gravity">center_horizontal</item> 
    <item name="android:padding">6dp</item> 
    <item name="android:background">@drawable/custom_button</item> 
    <item name="android:textColor">#ffffff</item> 
    <item name="android:gravity">center</item> 
    <item name="android:textStyle">bold</item> 
</style> 

Các drawable:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <shape> 
      <solid 
       android:color="#60ff0000" /> 
      <stroke 
       android:width="1dp" 
       android:color="#ffffff" /> 
      <corners 
       android:radius="4dp" /> 
      <padding 
       android:left="6dp" 
       android:top="6dp" 
       android:right="6dp" 
       android:bottom="6dp" /> 
     </shape> 
    </item> 
    <item> 
     <shape> 
      <solid 
       android:color="#90ff0000" /> 
      <stroke 
       android:width="1dp" 
       android:color="#ffffff" /> 
      <corners 
       android:radius="4dp" /> 
      <padding 
       android:left="6dp" 
       android:top="6dp" 
       android:right="6dp" 
       android:bottom="6dp" /> 
     </shape> 
    </item> 
</selector> 

Khi tôi đặt tất cả các thes giá trị padding cho một giá trị nhỏ như 2, nút được hiển thị gần như không có đệm trên Android 2.3.3 (có thể đúng) nhưng với một padding vẫn còn rất lớn trên Android 4.X (có thể là sai). Ai đó có thể thấy lý do tại sao?

Trả lời

31

Chủ đề Holo của Android đặt minWidth và minHeight trong system styles.xml resource for Holo.Widget.Button chỉ định các quy tắc ngoài các quy tắc được sử dụng bởi nút không phải là holo, Widget.Button. Ngay cả với một tiêu đề nút nhỏ, nút sẽ mất 64x48dip trong Android 4.2.

<Button 
    android:id="@+id/sample_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Z" 
    android:padding="6dp" 
    android:minHeight="1dp" 
    android:minWidth="1dp" 
    android:layout_marginBottom="6dp" 
    android:layout_marginRight="6dp" 
    style="@style/CustomButton" 
    android:textSize="16sp" /> 
+3

Vui lòng trợ giúp - đạo đức của câu chuyện này là luôn kiểm tra kiểu/mã trên Github để tìm manh mối về hành vi mặc định. –

+0

Có, nhận được điều đó;) – caw

0

Câu trả lời của David thực sự có thể là vấn đề. Tuy nhiên, tôi sẽ nghĩ rằng nếu chiều rộng và chiều cao tối thiểu là 48/64dp, việc thay đổi đệm từ 6dp xuống 2pd hoặc ngược lại sẽ không tạo sự khác biệt lớn, trừ khi nút thực tế đã đúng ở mức 48/64 dp đó kích thước.

Nếu đúng như vậy, tôi tự hỏi nếu đó có thể là lỗi trên Android. Nếu không có padding trên View được chỉ định, padding trong nền drawable được sử dụng (nếu có) Nếu đệm trên View được chỉ định, bất kỳ padding trong nền drawable được bỏ qua và padding đặt trên View được sử dụng.

Chỉ vì lợi ích của nó, bạn đã cố gắng để làm cho paddings thực sự lớn thay vì nhỏ và xem nếu có bất kỳ tác dụng?

+0

Bạn có thể đúng. Không biết giá trị của '@ string/button_caption' và thấy chính xác những gì Marco thấy, người ta chỉ có thể suy đoán. Tôi đồng ý rằng nó có thể là một lỗi, mặc dù tôi sẽ rất ngạc nhiên nếu padding drawable đã gây ra nó. Giá trị đệm đó chỉ ảnh hưởng đến bản vẽ nền. –

+0

Cảm ơn bạn! Nó có thể là một lỗi, bạn đã đúng. Tôi phải kiểm tra nó - và nó là * không *. Tất cả mọi thứ đang làm việc tốt và giải thích cho vấn đề này là những gì David đã viết. – caw