Ho un LinearLayout che vorrei cambiare il colore di sfondo di quando si fa clic su una delle sue viste secondarie (un ImageButton). Sono in grado di farlo, ma non immediatamente - il cambiamento non si verifica sullo schermo fino a più tardi (penso durante una chiamata onResume). Mi piacerebbe scoprire come forzare il layout a ridisegnare dopo aver impostato lo sfondo, prima che venga eseguita la prossima riga di codice. Ecco il metodo onClick del mio OnClickListener per il pulsante:Come forzare una vista per ridisegnare immediatamente prima dell'esecuzione della riga successiva del codice
di comandopublic void onClick(View v) {
LinearLayout parentLayout = (LinearLayout) v.getParent();
parentLayout.setBackgroundResource(R.color.my_color);
SystemClock.sleep(1000); //ms
}
Il sonno è lì per verificare se il ridisegno accade prima o dopo di esso. Il risultato: dopo. La maggior parte delle domande su questo argomento (come here e here) dicono di usare invalidate() sulla vista. Ho usato i comandi parentLayout.invalidate();
, parentLayout.postInvalidate();
e parentLayout.refreshDrawableState();
tra lo sfondo e le linee di sospensione, tutto inutilmente. Il ridisegno si verifica ancora dopo il comando di sospensione. Qualcuno può dirmi come farlo accadere immediatamente?
Altre informazioni utili: LinearLayout è associato alle righe di un ListView e OnClickListener in precedenza si trova in una classe personalizzata che estende SimpleCursorAdapter, non nell'attività stessa. (In questo modo posso impostare un listener per ciascuna delle righe in ListView.)
Sembra che non otterrete la risposta esatta per questo almeno non potrei trovarne uno. Puoi dirci perché hai bisogno che la vista venga ridisegnata immediatamente? Forse ci saranno altre soluzioni per risolvere il problema. – manjusg
@manjusg Quello che sto cercando di fare è proprio quello che viene normalmente fatto con il selettore in background di una vista in xml (lo sfondo cambia brevemente colore quando premuto poco prima dell'esecuzione della sua richiamata), tranne che voglio cambiare lo sfondo di una vista diversa da il pulsante premuto - vale a dire il layout che contiene il pulsante e anche una vista testuale. – pvans
@manjusg Le righe del mio listview hanno un testo e un pulsante di cancellazione, e vorrei che l'intera riga, inclusa la textview, fosse brevemente evidenziata prima di essere cancellata e rimossa, in modo che l'utente abbia qualche feedback che ha premuto il fila voleva dire. Forse c'è un modo per collegare le viste dei collegamenti con un selettore in xml? – pvans