2011-11-26 4 views
127

Ho un Activity con 3 EditText s e una vista personalizzata che funge da tastiera specializzata per aggiungere informazioni nei EditText s.Android get hosting Attività da una vista

Attualmente sto passando lo Activity nella visualizzazione in modo da ottenere il testo di modifica attualmente attivo e aggiornare il contenuto dalla tastiera personalizzata.

C'è un modo di fare riferimento all'attività principale e ottenere lo EditText attualmente attivo senza passare l'attività nella vista?

+5

La risposta corretta è di gomino. – djunod

risposta

152

seguenti metodi possono aiutare a

  1. Activity host = (Activity) view.getContext(); e
  2. view.isFocused()
+25

Non dimenticare che 'getContext()' potrebbe non restituire sempre un oggetto Activity se la tua vista non viene chiamata da un contesto di attività. Assicurati di pianificare in anticipo e fornisci un appropriato supporto. –

+1

@WordPressDeveloper - Come si può creare una vista senza un'attività? Intendi vista remota? Esistono altri casi di visualizzazioni creati al di fuori di un'attività? –

+1

@kilaka Widget, Fragments, RemoteViews, LayoutInflaters sono tutti i casi in cui è possibile creare una vista che non è legata a un'attività. –

195

Ho appena tirato che il codice sorgente dal MediaRouter nel official support library e finora funziona bene:

private Activity getActivity() { 
    Context context = getContext(); 
    while (context instanceof ContextWrapper) { 
     if (context instanceof Activity) { 
      return (Activity)context; 
     } 
     context = ((ContextWrapper)context).getBaseContext(); 
    } 
    return null; 
} 
+5

mentre? perché mentre? –

+2

È solo un modo per chiarire tutto il contesto di base, finché non viene trovata l'attività o uscire dal ciclo quando viene trovato il contesto di root.Causa il contesto radice avrà un baseContext nullo, che porta alla fine del ciclo. – Gomino

+10

Questo è un modo migliore per farlo. Dovrebbe essere contrassegnato come una risposta. – shadox

0

In Android 7+ la vista non ha accesso alla racchiude attività, quindi view.getContext() non può più essere eseguito su un'attività.

Invece, il codice qui sotto funziona in Android 7+ e 6:

private static Activity getActivity(final View view) { 
    return (Activity) view.findViewById(android.R.id.content).getContext(); 
} 
1

ho preso Gomino s' answer e modificato per adattarsi perfettamente a myUtils.java modo da poter utilizzare ovunque e ogni volta che ho bisogno . Spero che qualcuno lo trovi utile :)

abstract class myUtils { 
    public static Activity getActivity(View view) { 
     Context context = view.getContext(); 
     while (context instanceof ContextWrapper) { 
      if (context instanceof Activity) { 
       return (Activity)context; 
      } 
      context = ((ContextWrapper)context).getBaseContext(); 
     } 
     return null; 
    } 
}