Come scoprire quale vista è focalizzata?


89

Devo scoprire se una vista è focalizzata all'interno di un'attività e quale vista è. Come fare questo?

Risposte:


117

Chiama getCurrentFocus()l'attività.


Per qualche ragione restituisce null dopo aver ciclato tutte le viste figlio con l'azione "successiva".
WindRider

10
BTW, getCurrentFocus () è un metodo di attività, non di visualizzazione.
ToolmakerSteve

3
... quindi in frammenti possiamo usare getActivity (). getCurrentFocus (). clearFocus () es ..
Martin Pfeffer

È possibile ottenere attività di hosting da una visualizzazione e chiamata getCurrentFocus(), ma non così affidabile.
Eido95

kotlin: in frammento -activity?.currentFocus
Mohammad Reza Khahani

12

Dalla fonte dell'attività:

   /**
     * Calls {@link android.view.Window#getCurrentFocus} on the
     * Window of this Activity to return the currently focused view.
     * 
     * @return View The current View with focus or null.
     * 
     * @see #getWindow
     * @see android.view.Window#getCurrentFocus
     */
    public View getCurrentFocus() {
        return mWindow != null ? mWindow.getCurrentFocus() : null;
    }

7

Prova questo invece, metti tutto dentro a threade stampa l' id e il nome della classe live su logcat. Metti semplicemente questo codice nel tuo Activity, nel onCreatemetodo, quindi guarda nel tuo logcatper vedere cosa è attualmente focalizzato.

GIAVA

  new Thread(() -> {
        int oldId = -1;
        while (true) {
            View newView= this.getCurrentFocus();
            if (newView != null && newView.getId() != oldId) {
                oldId = view.getId();
                String idName = "";
                try {
                   idName = getResources().getResourceEntryName(newView.getId());
                 } catch (Resources.NotFoundException e) {
                   idName = String.valueOf(newView.getId());
                 }
                Log.i(TAG, "Focused Id: \t" + idName + "\tClass: \t" + newView.getClass());
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

KOTLIN

      Thread(Runnable {
            var oldId = -1
            while (true) {
                val newView: View? = this.currentFocus
                if (newView != null && newView.id != oldId) {
                    oldId = newView.id
                    var idName: String = try {
                        resources.getResourceEntryName(newView.id)
                    } catch (e: Resources.NotFoundException) {
                        newView.id.toString()
                    }
                    Log.i(TAG, "Focused Id: \t" + idName + "\tClass: \t" + newView.javaClass)
                }
                try {
                    Thread.sleep(100)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }).start()

Tieni presente che questo thread viene eseguito in un ciclo di 100 ms in modo da non sovraccaricare la CPU con lavoro non necessario.


Puoi estendere questo codice e aggiungere un'evidenziazione in modo da poter vedere quale elemento è selezionato. Dovrebbe funzionare finché l'elemento è all'interno dello schermo. Ma l'utilizzo di logcatè molto più sicuro.
Haroun Hajem

6

per qualche motivo il metodo getCurrentFocus () non è più disponibile; probabilmente è già deprecato, ecco l'alternativa funzionante:

View focusedView = (View) yourParentView.getFocusedChild();

1
Sono due metodi diversi. getCurrentFocus () è un metodo della classe Activity e getFocusedChild () appartiene alla classe View
BoredT

2
@BoredT: getFocusedChild()è un metodo su ViewGroup.
gnuf


1

ViewGroup ha un metodo abbastanza conveniente per recuperare il bambino concentrato:

ViewGroup.getFocusedChild()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.