2016-04-22 12 views

Trả lời

8

Cố gắng trong onDetachedFromWindow()

Unbinder unbinder; 
unbinder = Butterknife.bind(this, root); 

và trong onDetachedFromWindow bạn cần phải gọi unbinder.unbind();

@Override 
protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    // View is now detached, and about to be destroyed 
    unbinder.unbind() 
} 
+1

Đó là cách tiếp cận đúng, mặc dù hãy cẩn thận với điều đó, vì lệnh gọi 'onDetachedFromWindow' không nhất thiết phải có nghĩa là' Chế độ xem' sắp bị hủy (ví dụ: nếu đó là một phần của 'RecyclerView'). –

+1

@BartekLipinski Cách tiếp cận đúng cho chế độ xem tùy chỉnh trong ViewHolder là gì. Không thể gọi unbind trong onDetachedFromWindow(). – erdna

17

Vâng, onDetachedFromWindow là chức năng đúng như đã đề cập trong NJ's answer vì đây là nơi mà xem không còn có một bề mặt dùng để vẽ.

Nhưng mức sử dụng được đề cập không chính xác trong câu trả lời. Cách tiếp cận đúng liên quan đến việc ràng buộc trong onFinishInflate():

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 
    unbinder = ButterKnife.bind(this); 
} 

và unbinding trong onDetachedFromWindow:

@Override 
protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    // View is now detached, and about to be destroyed 
    unbinder.unbind(); 
} 
+1

Đã sửa câu trả lời của tôi :) cảm ơn vì đã trỏ –

+0

là cần thiết để ràng buộc khi ở chế độ xem tùy chỉnh? tôi không unbind trong một mảnh tại sao tôi cần phải làm điều này trong xem? im chỉ cần tự hỏi nếu nó cần thiết để làm sạch hoặc tại sao bận tâm unbinding? – j2emanue

+0

@ j2emanue Nếu bạn cần vô hiệu hóa các lượt xem và bỏ qua trình lắng nghe thì bạn nên gọi unbind trong chế độ xem tùy chỉnh. Nó không cần thiết nhưng là một cách tiếp cận được đề nghị. Bạn cũng nên bỏ liên kết trong Phân đoạn. Jake Wharton đã đề cập đến lý do tại đây: ' Có thể có trường hợp khi khung nhìn của mảnh bị phá hủy, nhưng thể hiện phân đoạn vẫn còn hiện diện. Ví dụ, khi đoạn đi vào ngăn xếp lại - onDestroyView() được gọi, nhưng onDestroy() không phải là.' nguồn: https://github.com/JakeWharton/butterknife/issues/291 –

0

Cảnh báo!

Nếu bạn đặt thuộc tính với app:attribute="value" trong XML, bạn sẽ mất giá trị của họ khi đọc với:

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 
    unbinder = ButterKnife.bind(this); 

    TypedValue typedValue = new TypedValue(); 
    TypedArray typedArray = getContext().obtainStyledAttributes(typedValue.data, R.styleable.YourStyleable); 
    try { 
     int number = typedArray.getResourceId(R.styleable.YourStyleable_number, 0); 
     image.setImageResource(number); 

     String text = typedArray.getString(R.styleable.YourStyleable_text); 
     text.setText(text); 
    } finally { 
     typedArray.recycle(); 
    } 
} 

giá trị của họ sẽ là 0 và null. Khởi tạo chúng trong hàm tạo của khung nhìn tùy chỉnh.

Lý do là sử dụng obtainStyledAttributes(typedValue.data thay vì obtainStyledAttributes(attrs.

Xem: Magic with obtainStyledAttributes method.

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