2012-11-13 23 views
8

Có ai giải thích cho tôi biết tại sao điều này xảy ra không?Đệm không hoạt động với một số tài nguyên nền nhất định

Tôi có lớp TextView mở rộng khá đơn giản. Khi tôi thiết lập màu nền cho Color.BLUE, padding hoạt động tốt. Khi tôi thay đổi tài nguyên nền thành android.R.drawable.list_selector_background, phần đệm của tôi không còn được áp dụng nữa. Những gì các F?

Đây là lớp giao diện người dùng của tôi:

public class GhostDropDownOption extends TextView { 

    TextView text_view; 


    public GhostDropDownOption(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setup(context); 
    } 


    public GhostDropDownOption(Context context) { 
     super(context); 
     setup(context); 
    } 


    private void setup(Context context) { 
     this.setClickable(false); 
     // THE 2 LINES BELOW ARE THE ONLY THING I'M CHANGING 
     //this.setBackgroundResource(android.R.drawable.list_selector_background); 
     this.setBackgroundColor(Color.BLUE); 
    } 
} 

Và tôi đang sử dụng nó trong cách bố trí như thế này:

<trioro.voyeur.ui.GhostDropDownOption 
    android:id="@+id/tv_dropdown_option_1" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:text="@string/request_control_dropdown_option_1" 
    android:textColor="#000000" 
    android:padding="10dip"/> 

Và đây là kết quả của việc thay đổi nền: enter image description here

Trả lời

11

Cuộc gọi tới:

this.setBackgroundResource(android.R.drawable.list_selector_background); 

sẽ xóa mọi bộ đệm được đặt trước tiên (điều này để làm cho nó hoạt động đúng với nội dung 9 bản vá).

Cố gắng thiết lập padding trong mã sau dòng trên, như thế này:

this.setPadding(PADDING_CONSTANT, PADDING_CONSTANT, PADDING_CONSTANT, PADDING_CONSTANT); 

Chỉ cần nhớ rằng các giá trị gửi đến setPadding là bằng pixel KHÔNG nhúng!

+1

Thông tin thêm có thể được tìm thấy tại đây: http://stackoverflow.com/questions/2886140/does-changing-the-background-also-change-the-padding-of-a-linearlayout – TofferJ

2

Bạn nên đặt nền có thể drawable trong XML nếu có thể. Nếu bạn đặt nó trong mã, nó sẽ sử dụng padding từ các tài nguyên có thể vẽ của bạn thay vì những gì bạn đặt trong XML, vì vậy nếu cần thiết để lập trình, bạn sẽ muốn truy xuất phần đệm hiện tại, lưu trữ tạm thời, đặt nền , và sau đó đặt padding trở lại như @TofferJ gợi ý.

Lý do cho điều này là bản thân các bản vẽ có thể có đệm, trong trường hợp hình ảnh 9-bit (nơi đường viền pixel dưới cùng và bên phải xác định lượng đệm).

giải pháp của bạn nên được để chỉ cần đặt tài nguyên nền của bạn trong XML:

android:background="@android:drawable/list_selector_background"

mặc dù tôi tin rằng có thể là một nguồn tài nguyên có thể vẽ được tin rằng bạn sẽ phải sao chép vào dự án của bạn đầu tiên.

+1

Cảm ơn, đây là một điều tuyệt vời vì tôi chỉ sử dụng một vài trường hợp của lớp UI của mình. Hóa ra tôi không phải sao chép nó vào dự án của mình. Dòng này sẽ lấy nội dung có thể vẽ được từ bất kỳ thiết bị nào mà ứng dụng được cài đặt trên đó. – raydowe

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