2010-12-12 43 views
5

Đây là vấn đề của tôi ...:drawable == drawable?

Trong hoạt động của tôi, tôi có ImageViewButton. Tôi muốn Nút chỉ thực hiện tác vụ khi màn hình ImageView hiển thị một hình vẽ nhất định. Và vâng, điều này có nghĩa là ImageView là hoạt ảnh giữa các bản vẽ khác nhau được mã hóa sao cho nó không bị gián đoạn với những gì tôi muốn.

ImageView imgview = (ImageView)findViewById(R.id.imgviewsid); 
Resources res = getResources(); 
Drawable acertaindrawable = res.getDrawable(R.drawable.thecertaindrawable); 
Drawable variabledrawable = imgview.getDrawable(); 

    if (variabledrawable == acertaindrawable) 
    { 
      //does something 
    } 

Nó không hoạt động. Và tôi đã thu hẹp nó xuống đến lỗi của dòng "if (variabledrawable == acertaindrawable)". Trong khi Eclipse không thẳng thắn báo cáo lỗi mà Android không thể nhận ra nếu hai drawables là như nhau, tôi đã thử nghiệm các khu vực khác của mã và tất cả dường như làm việc tốt.

Trả lời

3

Theo giải thích của Itsik, ngay cả khi cả hai biến chứa tham chiếu đến đối tượng 'trông' giống nhau, chúng là 2 đối tượng khác nhau.

Toán tử == so sánh tham chiếu. Nó trả về true chỉ khi cả hai biến tham chiếu đến cùng một cá thể đối tượng tức là. cùng một không gian bộ nhớ.

Không thể vẽ cũng như BitmapDrawable thực hiện phương thức .equals() cụ thể có thể đã được điều chỉnh để kiểm tra 2 trường hợp chứa cùng dữ liệu, vì vậy Mathias Lin gợi ý thử .equals() sẽ không hoạt động.

Bạn có thể làm gì, theo lời khuyên của Itsik mà không cần phải kéo dài Drawable, sử dụng phương thức View.setTag() và View.getTag(). Các phương thức này cho phép gắn bất kỳ đối tượng nào bạn chọn vào một khung nhìn và truy xuất nó sau này. Bằng cách gắn một số nhận dạng đơn giản (có thể là số nhận dạng số nguyên hoặc url xác định nguồn của bitmap) cho ImageView của bạn mỗi khi bạn thay đổi nội dung của nó, bạn sẽ có thể nhận ra nó một cách dễ dàng.

+0

Chỉ cần hướng tôi cần, việc sử dụng Thẻ chắc chắn đã giúp ích cho những gì tôi muốn đạt được. Cảm ơn! – sneak14

2

Hãy thử if (acertaindrawable.equals(variabledrawable)) ...

2

variabledrawable và acertaindrawable không phải là đối tượng tương tự, mặc dù họ có thể hiển thị các drawable cùng.

Nếu Android không cung cấp cho bạn cách tích hợp để so sánh bản vẽ (tôi đoán nó phụ thuộc vào bạn có thể vẽ cụ thể), lời khuyên của tôi cho bạn là Mở rộng lớp Có thể vẽ mà bạn đang sử dụng và thêm riêng tư trường có chứa một số loại ID để bạn có thể so sánh giữa các lần kéo.

1

bạn cũng có thể thử:

getId() và setId(): =)

cũng có thể được sử dụng để so sánh nếu thẻ đã được sử dụng cho cái gì khác :)

Ps .: nhưng xem ra nếu bạn đang sử dụng RelativeLayouts ...: P =

8

Tôi biết nó khá muộn để đăng bài này, nhưng nó sẽ hữu ích cho bất cứ ai googling.

Tôi đã sử dụng. getConstantState() để so sánh hai drawables của tôi và nó làm việc như một nét duyên dáng :)

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