2016-04-22 25 views

Odpowiedz

8

Spróbuj w onDetachedFromWindow()

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

aw onDetachedFromWindow trzeba zadzwonić unbinder.unbind();

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

To jest właściwe podejście, ale bądź ostrożny z tym, ponieważ wywołanie zwrotne 'onDetachedFromWindow' niekoniecznie musi oznaczać, że' Widok' wkrótce zostanie zniszczony (np. Jeśli jest częścią 'RecyclerView'). –

+1

@BartekLipinski Jakie jest właściwe podejście do niestandardowego widoku w ViewHolder. Wywołanie opcji unbind w onDetachedFromWindow() nie jest możliwe. – erdna

17

Tak, onDetachedFromWindow jest właściwa funkcja jak wspomniano w NJ's answer ponieważ jest to miejsce gdzie widok nie ma powierzchnię do rysowania.

Ale użycie jest nieprawidłowo wymienione w odpowiedzi. Właściwe podejście polega na wiązaniu w onFinishInflate():

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

i niewiążące w onDetachedFromWindow:

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

Poprawiono moją odpowiedź :) dziękuję za wskazanie –

+0

czy konieczne jest powiązanie w niestandardowym widoku? nie odrywam fragmentu, dlaczego muszę to zrobić w widoku? Zastanawiam się tylko, czy jest to wymagane do czyszczenia lub po co przeszkadzać? – j2emanue

+0

@ j2emanue Jeśli potrzebujesz null out views i null out listeners, lepiej wywołaj unbind w niestandardowym widoku. To nie jest potrzebne, ale zalecane podejście. Powinieneś także odłączyć w Fragment. Jake Wharton wspomniał o powodzie: " Może być przypadek, gdy widok fragmentu zostanie zniszczony, ale jego fragment nadal istnieje. Na przykład, gdy fragment przechodzi na tylny stos - nazywa się onDestroyView(), ale onDestroy() nie jest. " źródło: https://github.com/JakeWharton/butterknife/issues/291 –

0

Ostrzeżenie!

Jeśli ustawione atrybuty z app:attribute="value" w XML, straci swoje wartości podczas czytania z:

@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(); 
    } 
} 

Ich wartość wyniesie 0 i wartość null. Zainicjuj je w konstruktorze widoku niestandardowego.

Powodem jest użycie obtainStyledAttributes(typedValue.data zamiast obtainStyledAttributes(attrs.

Zobacz: Magic with obtainStyledAttributes method.

Powiązane problemy