Qual è la migliore pratica per la chiamata: -butterknife visualizzazione personalizzata non associare
Butterknife.unbind()
in una visualizzazione personalizzata di Android per favore?
Qual è la migliore pratica per la chiamata: -butterknife visualizzazione personalizzata non associare
Butterknife.unbind()
in una visualizzazione personalizzata di Android per favore?
Prova a onDetachedFromWindow()
Unbinder unbinder;
unbinder = Butterknife.bind(this, root);
e in onDetachedFromWindow
è necessario chiamare unbinder.unbind();
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
// View is now detached, and about to be destroyed
unbinder.unbind()
}
Sì, onDetachedFromWindow
è la funzione giusta come indicato nel NJ's answer perché è qui vista non ha più una superficie per il disegno.
Ma l'utilizzo è indicato erroneamente nella risposta. Il giusto approccio consiste nel legame in onFinishInflate()
:
@Override
protected void onFinishInflate() {
super.onFinishInflate();
unbinder = ButterKnife.bind(this);
}
e non vincolante in onDetachedFromWindow
:
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
// View is now detached, and about to be destroyed
unbinder.unbind();
}
Corretto la mia risposta :) grazie per il puntamento –
è necessario collegarsi in una vista personalizzata? non mi sbaglio in un frammento perché devo farlo nella vista? mi sto solo chiedendo se è necessario per la pulizia o perché preoccuparsi di sciogliersi? – j2emanue
@ j2emanue Se è necessario annullare la visualizzazione e escludere gli ascoltatori, è meglio chiamare unbind in una visualizzazione personalizzata. Non è necessario, ma un approccio consigliato. Si dovrebbe anche separare in Fragment. Jake Wharton ha citato il motivo qui: ' Ci può essere un caso in cui la vista del frammento viene distrutta, ma l'istanza del frammento è ancora presente. Ad esempio, quando il frammento entra nello stack posteriore, viene chiamato onDestroyView(), ma onDestroy() non lo è. source: https://github.com/JakeWharton/butterknife/issues/291 –
Attenzione!
Se si imposta attributi con app:attribute="value"
in XML, si perde i loro valori durante la lettura di:
@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();
}
}
I loro valori saranno 0 e nullo. Inizializzali nel costruttore della vista personalizzata.
Un motivo sta utilizzando obtainStyledAttributes(typedValue.data
anziché obtainStyledAttributes(attrs
.
Questo è l'approccio corretto, anche se attenzione, perché la richiamata "onDetachedFromWindow' non deve necessariamente significare che il' View' sta per essere distrutto (ad esempio se fa parte di 'RecyclerView'). –
@BartekLipinski Qual è l'approccio giusto per la visualizzazione personalizzata in una ViewHolder. Chiamare unbind in onDetachedFromWindow() non è possibile. – erdna