2016-04-22 26 views

risposta

8

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() 
} 
+1

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'). –

+1

@BartekLipinski Qual è l'approccio giusto per la visualizzazione personalizzata in una ViewHolder. Chiamare unbind in onDetachedFromWindow() non è possibile. – erdna

17

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

Corretto la mia risposta :) grazie per il puntamento –

+0

è 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

+0

@ 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 –

0

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.

Vedere: Magic with obtainStyledAttributes method.

Problemi correlati