Cách đặt màu nền của Chế độ xem


179

Tôi đang cố gắng đặt màu nền của Chế độ xem (trong trường hợp này là Nút).

Tôi sử dụng mã này:

// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

Nó làm cho Nút biến mất khỏi màn hình. Tôi đang làm gì sai và cách chính xác để thay đổi màu nền trên bất kỳ Chế độ xem nào?

Cảm ơn.


1
Điều đó có vẻ đúng. Thực tế, tôi không nghĩ bạn cần gọi không hợp lệ (). Khi bạn nói nút biến mất, bạn có nghĩa là theo nghĩa đen hoặc bạn có nghĩa là nút có văn bản hoặc hình ảnh trên đó biến mất?
RickNotFred

Câu trả lời:


281

Bạn đã làm cho nút của bạn trong suốt. Byte đầu tiên là alpha.

Thử v.setBackgroundColor(0xFF00FF00);


2
Câu trả lời của EddieB dưới đây tốt hơn nhiều vì điều này sẽ loại bỏ bất kỳ đường viền nào, v.v. chẳng hạn như gạch chân của EditText
Molten Ice

@aroth là màu sắc tốt hơn. Màu xanh lá cây? Nếu tôi muốn màu phức tạp với argb? ... câu trả lời của bạn không được chấp nhận
delive

2
@delive - Lại nữa à? Color.GREENkhông phản đối, và bao gồm các byte alpha. Đó là giá trị 0xff00ff00, chính xác giống như những gì đang gợi ý trong câu trả lời, ngoại trừ nó cũng có lợi ích của việc do con người có thể đọc được . Hầu hết các nhà phát triển sẽ thích một giải pháp dễ đọc cho con người.
aroth

145

Khi bạn gọi setBackgoundColor, nó sẽ ghi đè / xóa bất kỳ tài nguyên nền hiện có nào, bao gồm mọi đường viền, góc, phần đệm, v.v. Điều bạn muốn làm là thay đổi màu của tài nguyên nền hiện có ...

View v;
v.getBackground().setColorFilter(Color.parseColor("#00ff00"), PorterDuff.Mode.DARKEN);

Thử nghiệm với PorterDuff.Mode. * Cho các hiệu ứng khác nhau.


"ghi đè / xóa bất kỳ tài nguyên nền hiện có", không thực sự.
Yousha Aleayoub

2
Tôi đã phải sử dụng ở trên cùng với v.invalidate (); trên dòng tiếp theo.
Hashim Akhtar

1
đã thử lãng phí thời gian này và đi với câu trả lời được chấp nhận, v.getBackground () đã đưa ra ngoại lệ nullpulum và bị lỗi.
Siddarth G

Điều này cộng với PorterDuff.Mode.SRC_IN đã giải quyết cho tôi để tôi không bị mất đường viền nền.
Guilherme Carvalho

123

Một số lựa chọn để làm điều này ...

Đặt nền thành màu xanh lá cây:

v.setBackgroundColor(0x00FF00);

Đặt nền thành màu xanh lục với Alpha :

v.setBackgroundColor(0xFF00FF00);

Đặt nền thành màu xanh lục với hằng số Color.GREEN:

v.setBackgroundColor(Color.GREEN);

Đặt nền thành màu xanh xác định trong Colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>     
    <color name="myGreen">#00FF00</color> 
    <color name="myGreenWithAlpha">#FF00FF00</color> 
</resources>

và sử dụng:

v.setBackgroundResource(R.color.myGreen);

và:

v.setBackgroundResource(R.color.myGreenWithAlpha);

hoặc dài hơn:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreen));

và:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreenWithAlpha));

getResources().getColor(...)đã bị phản đối stackoverflow.com/questions/31842983/
Mạnh

5
Ngoài ra còn có: v.setBackgroundResource(R.color.myGreen);khi sử dụngcolors.xml
nghiệt ngã

Đã xóa các invalidatecuộc gọi, vì bạn có thể thấy setBackground... các phương thức đã gọi đó.
weston

v.setBackgroundColor(0x00FF00);chỉ là mã của họ mà họ nói không hoạt động. Tôi cũng mong đợi nó được minh bạch.
weston

35

Bạn có thể đặt màu hex cho bất kỳ tài nguyên nào bằng:

View.setBackgroundColor(Color.parseColor("#e7eecc"));

16
// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

Mã không đặt nút thành màu xanh lá cây. Thay vào đó, nó làm cho nút hoàn toàn vô hình.

Giải thích: giá trị hex của màu là sai. Với giá trị Alpha bằng 0, màu sẽ vô hình.

Giá trị hex chính xác là 0xFF00FF00cho màu xanh lục mờ đầy đủ. Mọi giá trị Alpha trong khoảng từ 00 đến FF sẽ gây ra độ trong suốt.


12

và cách chính xác để thay đổi màu nền trên bất kỳ Chế độ xem nào?

Trên cái nào View ? Những gì bạn có là chính xác, mặc dù bạn nên bỏ invalidate()cuộc gọi.

Tuy nhiên, một số Viewsđã có nền tảng. A Button, ví dụ, đã có một nền tảng: mặt của nút. Nền này là một StateListDrawablecái mà bạn có thể tìm thấy trong bản android-2.1/data/res/drawable/btn_default.xmlcài đặt SDK Android của mình. Điều đó, đến lượt nó, đề cập đến một loạt các hình ảnh bitmap chín miếng, có sẵn trong nhiều mật độ. Bạn sẽ cần sao chép và sửa đổi tất cả những điều đó để hoàn thành mục tiêu xanh của mình.

Nói tóm lại, bạn sẽ được phục vụ tốt hơn khi tìm một mẫu UI khác thay vì cố gắng thay đổi nền của a Button.


OK, cảm ơn bạn đã giải thích về hình nền Nút. Chín bitmap vá ( developer.android.com/reference/android/graphics/NinePatch.html ) là mới đối với tôi. Tôi chỉ đơn giản muốn thay đổi màu sắc của bất cứ thứ gì trên màn hình khi nhấn Nút. Các nút nằm trên TextView. Cố gắng thay đổi màu của điều đó, dẫn đến thông báo trên bảng điều khiển "DDM gửi reg chờ thời gian chờ ... ActivityManager: Không thể gửi DDM chunk 52454151: không có trình xử lý nào được xác định" và một hộp thoại trên màn hình "ứng dụng dừng đột ngột". Đoán tôi cần phải đọc nhiều hơn về giao diện người dùng. Bất kỳ gợi ý chào đón. Cảm ơn.
Peter vdL

12

Để đặt màu đầu tiên được nhìn thấy trên màn hình, bạn cũng có thể thực hiện màu đó trong layout.xml có liên quan (thiết kế tốt hơn) bằng cách thêm thuộc tính này vào Chế độ xem có liên quan:

android:background="#FF00FF00"

Câu hỏi làm rõ rằng sự thay đổi màu sắc cần phải năng động.
Peter vdL


6

Tôi sử dụng tại API tối thiểu 16, mục tiêu 23

Button WeekDoneButton = (Button) viewWeeklyTimetable.findViewById(R.id.week_done_button);

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));

Thông thường không có nhiều màu mặc định. Màu sắc mới có thể được xác định theo độ phân giải / giá trị / màu sắc như được mô tả ở đây developer.android.com/samples/BasicMediaRouter/res/values/
trộm

5

Bạn có thể sử dụng đơn giản:

view.setBackgroundColor(Color.parseColor("#FFFFFF"));


4

Câu hỏi này nói về việc thay đổi màu nền của một khung nhìn. Trong một trong những câu trả lời, người này giải thích cách thay đổi màu nền trong thời gian chạy. Rõ ràng là bạn sẽ xem xét cách sửa đổi các đối tượng khác trên màn hình, nhưng điều này sẽ cho bạn một khởi đầu tốt bằng cách ít nhất là cho phép bạn sửa đổi màu nền của chế độ xem khi nhấp vào nút.


3

Nói với Android 6 sử dụng ContextCompact

        view.setBackgroundColor( ContextCompat.getColor(this, R.color.your_color));


2

Trong kotlin bạn có thể làm điều đó như thế này:

val backgroundColor = R.color.whatever_color_you_like
view.setBackgroundColor(getColorCompat(backgroundColor))

Trong trường hợp getColorCompat()là một chức năng mở rộng:

/**
 * Extension method to provide simpler access to {@link ContextCompat#getColor(int)}.
 */

 fun Context.getColorCompat(color: Int) = ContextCompat.getColor(this, color)

1
view.setBackgroundColor(R.color.primaryColor);

Thêm màu vào giá trị màu trước đó, vì vậy tôi có một màu khác.

Những gì làm việc cho tôi là:

view.setBackgroundResource(R.color.primaryColor);

1

Hãy giả sử chúng ta có một màu cơ bản trong values=>colors.xmlnhư:

<resources>
    <color name="primary">#FDD835</color>
</resources>

Vì vậy, nếu chúng ta muốn sử dụng màu tùy chỉnh của mình vào setBackgroundColor(@ColorInt int Color)thì chúng ta chỉ cần một chú thích @SuppressLint("ResourceAsColor")với hàm tạo / phương thức sẽ được sử dụng như:

    @SuppressLint("ResourceAsColor")
    public _LinearLayout(Context context) {
        super(context);

        // Formatting our layout : )
        super.setBackgroundColor(R.color.primary);

        ....


    }

0

Bạn phải vượt qua một inttrong các đối số.

Ví dụ đầu tiên:

view.setBackgroundColor(-500136)

Ví dụ thứ hai:

int colorId = R.color.green;

view.setBackgroundResource(colorId);

0

Điều này sẽ hoạt động tốt: v.setBackgroundColor(0xFF00FF00);


0

Tôi đã thử tất cả các cách trên. Nhưng tôi chưa đạt được những gì tôi cần. Đây là cố gắng của tôi. Nếu bạn đang sử dụng hexcode cho màu sắc và muốn đặt màu làm nền của hình ảnh, thì đây là mã kotlin.

val bitmap = Bitmap.createBitmap(30, 30, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val colorCode = "#ffffff"
canvas.drawColor(Color.parseColor(colorCode))
mImageViewLogo.setImageBitmap(bitmap)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.