2011-11-26 23 views
127

Mam Activity z 3 EditText s i niestandardowy widok, który działa wyspecjalizowana klawiatura, aby dodać informacje do EditText s.Android uzyskać hosting działalności z widoku

Aktualnie przesyłam do widoku Activity, dzięki czemu mogę uzyskać aktualnie aktywny tekst edycji i zaktualizować zawartość z niestandardowej klawiatury.

Czy istnieje sposób odwoływania się do działania nadrzędnego i uzyskania aktualnie skupionego EditText bez przekazywania czynności do widoku?

+5

Poprawną odpowiedzią jest gomino. – djunod

Odpowiedz

152

Następujące metody mogą pomóc

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

Po prostu nie zapominaj, że 'getContext()' nie zawsze zwraca obiekt aktywności, jeśli widok nie jest wywoływany z kontekstu działania. Pamiętaj, aby zaplanować to wcześniej i podać odpowiednie zabezpieczenie. –

+1

@WordPressDeveloper - Jak widok można utworzyć bez aktywności? Masz na myśli widok zdalny? Czy istnieją inne przypadki wyświetleń, które powstają poza działaniem? –

+1

@kilaka Widżety, fragmenty, RemoteViews, LayoutInflaters to przypadki, w których można utworzyć widok, który nie jest powiązany z działaniem. –

195

prostu wyciągnął tego kodu źródłowego z MediaRouter w official support library i jak dotąd działa dobrze:

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

podczas? dlaczego, podczas gdy? –

+2

To tylko sposób na zbieranie się przez cały kontekst bazowy, aż do znalezienia aktywności lub wyjście z pętli po znalezieniu kontekstu głównego.Powoduje, że kontekst główny będzie mieć zerowy baseContext, prowadzący do końca pętli. – Gomino

+10

To jest lepszy sposób na zrobienie tego. Powinien być oznaczony jako odpowiedź. – shadox

0

W Androidzie 7+ pogląd nie ma dostępu do załączania aktywność już nie jest, więc view.getContext() nie można już przesyłać do aktywności.

Zamiast poniższy kod działa w Androidzie 7+ i 6:

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

Wziąłem Gomino „s answer i modyfikować ją idealnie dopasować się myUtils.java więc można go używać zawsze i wszędzie muszę . Mam nadzieję, że ktoś uzna to za pomocne :)

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; 
    } 
} 
Powiązane problemy