Jaka jest najlepsza praktyka dla połączeń: -butterknife niestandardowy widok rozpiąć
Butterknife.unbind()
w niestandardowy Android widoku proszę?
Jaka jest najlepsza praktyka dla połączeń: -butterknife niestandardowy widok rozpiąć
Butterknife.unbind()
w niestandardowy Android widoku proszę?
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()
}
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();
}
Poprawiono moją odpowiedź :) dziękuję za wskazanie –
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
@ 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 –
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
.
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'). –
@BartekLipinski Jakie jest właściwe podejście do niestandardowego widoku w ViewHolder. Wywołanie opcji unbind w onDetachedFromWindow() nie jest możliwe. – erdna