Dopo aver letto la risposta da @Raj, passando attraverso l'Android documentation e sperimentando il codice, penso di capire come funzionano un po 'meglio ora. Ecco un piccolo aiuto aggiuntivo se qualcun altro è confuso allo stesso modo. Fammi sapere se ho sbagliato.
Le viste possono essere focalizzate o sfocate. Alcune visualizzazioni cambiano il loro aspetto quando sono focalizzate. Questo può essere particolarmente utile quando si utilizza una tastiera per navigare nel layout. In questo modo sai dove sei prima di fare effettivamente clic su una vista. Anche le visualizzazioni che non cambiano in modo naturale quando è possibile eseguire la messa a fuoco da parte di using a selector and drawables. Se non si utilizza una tastiera per navigare, tuttavia, la messa a fuoco non è così importante.
C'erano tre coppie di cose che mi sono stati di confusione:
isFocusable()
isFocusableInTouchMode()
setFocusable()
setFocusableInTouchMode()
requestFocus()
requestFocusFromTouch()
La prima coppia appena ti dice informazioni sulla vista. Cioè, anche se non è nemmeno possibile che quella vista sia focalizzata. Si può scoprire facendo qualcosa di simile a questo:
Boolean b = myView.isFocusable();
Sei in modalità touch, dopo aver toccato lo schermo. Quindi qualcosa che può essere messa a fuoco quando si utilizza la tastiera potrebbe non essere messa a fuoco quando si usano le dita. È possibile controllare in questo modo:
Boolean b = myView.isFocusableInTouchMode();
Come ho detto, questo dice solo informazioni su se è ancora possibile per dare il focus vista o non. Se vuoi veramente focalizzare la vista, per prima cosa devi rendere possibile la messa a fuoco. È possibile farlo con uno dei seguenti comandi:
myView.setFocusable(true);
myView.setFocusableInTouchMode(true);
Se si è in modalità touch e si chiama setFocusableInTouchMode(true)
allora sia myView.isFocusable()
e myView.isFocusableInTouchMode()
restituirà true. Non è necessario chiamarli entrambi. Tuttavia, se si chiama solo myView.setFocusable(true)
, allora myView.isFocusableInTouchMode()
non verrà modificato.
Ora per fare finalmente la vista concentrata si deve chiamare il seguente:
myView.requestFocus();
io continuo a non capire pienamente requestFocusInTouchMode()
perché usando solo requestFocus()
lavorato per me, ma il documentation dice a proposito requestFocusInTouchMode()
:
Chiamare questo per provare a mettere a fuoco una vista specifica o uno dei suoi discendenti. Questa è una variante speciale di requestFocus() che consente di ottenere visualizzazioni non focalizzate in modalità touch per richiedere la messa a fuoco quando vengono toccate.
Infine, va notato che Romain Guy detto in questo post:
Una vista che è attivabile in modalità touch ha interazioni strane e se non si capisce perfettamente quello che state facendo voi non dovrebbe usare. requestFocus() funziona, ma la messa a fuoco viene visualizzata solo quando il dispositivo non è in modalità tocco. Non appena l'utente tocca lo schermo, la messa a fuoco non viene più visualizzata. Facendo ciò che stai facendo, la tua app si comporta in modo diverso dal resto del sistema e rischi di comportarti in modo strano.
Questo è chiaramente spiegato nella documentazione. – nhaarman
Spesso trovo le spiegazioni sull'overflow dello stack più facili da comprendere rispetto alla documentazione. Sto cercando di consultare la documentazione ora, ma ho difficoltà a capirlo. Speravo che qualcuno qui fosse disposto a spiegare e magari dare un esempio. – Suragch
Ho aggiunto la mia risposta qui sotto per spiegare più chiaramente cosa non ho capito quando ho chiesto. – Suragch