2013-02-14 53 views
15

Tôi đang tạo ứng dụng có nhiều màn hình. hầu hết các màn hình đều có Chế độ xem ở trên cùng với màu nền.Android Xem thay đổi nền bất ngờ

tôi thường thay đổi điều đó màu sử dụng view.setBackgroundColor (màu)

Ở đây có điều kỳ lạ: đôi khi sau khi cài đặt màu sắc của một cái nhìn, nói với # f14fb7, khi điều hướng trong ứng dụng, hình nền khung nhìn khác được đặt thành màu đó mà không cần tôi muốn. Đôi khi nó thậm chí xảy ra với quan điểm tôi đã không thiết lập một id cho, do đó, không có cách nào setBackgroundColor được gọi trên những quan điểm.

Điều này hiếm khi xảy ra và không phù hợp với bất kỳ luồng nào tôi đã thử.

Khi tôi giết ứng dụng và khởi động lại, mọi thứ hoạt động như mong muốn.

Đoán duy nhất của tôi là một số vị vua bị rò rỉ bộ nhớ, nhưng tôi hy vọng có một lời giải thích đơn giản hơn.

Có ai có thể nghĩ ra một số lý do khiến điều này xảy ra không?

* Nó xảy ra trên Galaxy S3 của tôi.

+2

Chúng ta cần phải thấy một số mã để hiểu làm thế nào chính xác bạn đang đặt ra màn hình của bạn và quan điểm trên. –

+0

Cũng có thể là bạn có nền ngoài cùng nhiều nhất với một màu và sau đó bạn có bố trí khác trên nó với nền trong suốt hoặc một cái gì đó? – Nezam

+0

Tôi không có mã để đăng vì điều này xảy ra trong suốt ứng dụng. Nezam, không có gì giống như vậy ... 95% thời gian vấn đề này không xảy ra. nhưng mã để đặt nền là view.setBackgroundColor (màu) ... không có gì đặc biệt. điều kỳ lạ là nó ảnh hưởng đến các màn hình khác không liên quan gì đến màn hình cụ thể đó ... đó là lý do tại sao tôi nghi ngờ đó là bộ nhớ bị rò rỉ – dors

Trả lời

13

Nếu không có mã nó không phải dễ dàng ... nhưng tôi đoán bạn đang sử dụng lại cùng ColorDrawable trên nhiều quan điểm và nếu bạn có một cái nhìn tại View.setBackgroundColor() mã nguồn:

public void setBackgroundColor(int color) { 
    if (mBGDrawable instanceof ColorDrawable) { 
     ((ColorDrawable) mBGDrawable).setColor(color); 
    } else { 
     setBackgroundDrawable(new ColorDrawable(color)); 
    } 
} 

Bạn có thể thấy rằng nó thay đổi màu của ColorDrawable và không tạo một màu mới mỗi lần. Tôi khá chắc chắn đây là lý do tại sao bạn có hành vi kỳ lạ này.

EDIT

Khi bạn thiết lập màu nền ban đầu trong xml với android:background bạn đang làm điều này (theo android doc):

Đặt nền tảng cho một tài nguyên nhất định. Tài nguyên nên tham chiếu đến đối tượng Có thể vẽ

Theo hiểu biết của tôi, trường sẽ đặt trường View.mBGDrawable trong thời gian tăng. Tôi khuyên bạn nên sử dụng View.setBackgoundDrawable(new ColorDrawable(the_color_int_code))) thay vì setBackgroung(the_color_int_code). Nó sẽ giải quyết vấn đề của bạn.

+0

Tại sao bạn nghĩ tôi sử dụng cùng một ColorDrawable trên nhiều chế độ xem? Như bạn có thể thấy trong mã nguồn, tất cả những gì tôi làm là chuyển màu (int), và lớp View đã tạo một thể hiện ColorDrawable mới nếu cần. Hơn nữa, khi hành vi strage này xảy ra, nếu tôi gỡ lỗi màu sắc của lượt xem có vẻ như nó có bộ màu chính xác, khi trên thực tế, một màu khác nhau được hiển thị. – dors

+0

để xác thực hoặc không đề xuất của tôi: khi gỡ lỗi lưu ý tham chiếu của 'mBGDrawable' của 2 chế độ hiển thị sai cùng một nền. Nếu đây là cùng một tham chiếu, đề xuất của tôi là đúng. – ben75

+0

Và nếu bạn đúng, làm thế nào tôi có thể sửa lỗi này? Tôi không phải là tạo ra một thể hiện ColorDrawable mới, lớp View hiện rằng – dors

1

Tạo tệp "colors.xml" trong thư mục "giá trị". Ví dụ:

<?xml version="1.0" encoding="utf-8"?> 
<resources><color name="pink">#f14fb7</color></resources> 

Sử dụng view.setBackgroundResource(R.color.pink);

5

Điều này thường xảy ra nếu bạn có một cái nhìn có màu được đặt trong xml ví dụ:

android:background="@color/cyan" 

Bây giờ này trong nội bộ tạo ra một mới ColorDrawable - cho phép gọi nó là conceptual_drawable_cyan bên trong lớp của chế độ xem đó.Bây giờ khi cùng xem được gán một màu sắc khác nhau theo chương trình sử dụng:

view.setBackgroundColor(newColor); 

Bên trong quan điểm này thay vì tạo một drawable khác nhau nó đặt newColor này để drawable_cyan. Do đó từ thời điểm này trở đi nếu bạn bất cứ nơi nào sử dụng

android:background="@color/cyan" 

quan điểm thực sự sẽ sử dụng conceptual_drawable_cyan với newColor.

Giải pháp:

Thay vì sử dụng setBackgroundColor để thiết lập màu lập trình, sử dụng:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
     view.setBackground(new ColorDrawable(newColor)); 
    } else { 
     view.setBackgroundDrawable(new ColorDrawable(newColor)); 
    }