2012-10-29 12 views
37

Chcę uzyskać widok lub findViewById() z kontekstu? Lub z zamiarem?android - Jak uzyskać widok z kontekstu?

Próbuję uzyskać określony widok w moim odbiorniku, a parametr onReceive to kontekst i intencja.

Cóż, mam klasę, w której jest mój odbiornik. Teraz próbuję oddzielić odbiornik od niego, ale potrzebuję sposobu, abym mógł nadal komunikować się z widokami na mojej klasie z mojej wydzielonej klasy odbiorników.

Dzięki.

Odpowiedz

5

W odbiorniku transmisji można uzyskać dostęp do widoku poprzez inflację układ korzeniowy z zasobu XML, a następnie znaleźć wszystkie widoki z tego układu korzeniowego z findViewByid():

View view = View.inflate(context, R.layout.ROOT_LAYOUT, null); 

Teraz można uzyskać dostęp do swoich poglądów poprzez „widok” i oddać je do swojego typu widok:

myImage = (ImageView) view.findViewById(R.id.my_image); 
+0

Jaki powinien być umieściłem na parametrze korzeni? – lorraine

+0

Parametr korzenia to główny Widok zawyżonej hierarchii. W powyższym przykładzie pokazałem, jak nadmuchać widok, który jest już rootem, dlatego możesz zachować ten parametr jako fałszywy. Jeśli twój zawyżony widok nie jest korzeniem, to umieść widok główny jako trzeci parametr. –

+3

Czy nie powinno to być 'null' zamiast' false'? – Roberto

43

wychodząc z kontekstu, widok korzeń powiązanej działalności można było przez

View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content); 

surowca Androida że to wyglądać mniej więcej tak:

View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content) 

Następnie wystarczy zadzwonić do findViewById na tej

View v = rootView.findViewById(R.id.your_view_id); 
+3

Pamiętaj, że powinieneś rzucić 'View v = rootView.findViewById (R.id.your_view_id);' na 'View v = (View) rootView.findViewById (R.id.your_view_id); 'a klasa _View_ może być dowolną pochodną klasy View. –

+1

Podczas próby otrzymuję komunikat "Przyczyna: java.lang.ClassCastException: android.app.Application nie można przesłać do pliku android.app.Activity". – drynyn

+2

@drynyn to dlatego, że ten przykład zakłada, że ​​działanie jest przekazywane dla kontekstu, co nie jest bezpiecznym założeniem. Możesz użyć słowa kluczowego instanceof, aby sprawdzić, czy rzutowanie jest bezpieczne, czy nie. (dla przykładu "google" instanceof java). – eimmer

1

pierwszego użycia to:

LayoutInflater inflater = (LayoutInflater) Read_file.this 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

Read file is current activity in which you want your context. 

View layout = inflater.inflate(R.layout.your_layout_name,(ViewGroup)findViewById(R.id.layout_name_id)); 

następnie można użyć tego znaleźć dowolny element w układzie.

ImageView myImage = (ImageView) layout.findViewById(R.id.my_image); 
41

Na przykład można znaleźć żadnego TextView:

TextView textView = (TextView) ((Activity) context).findViewById(R.id.textView1); 
+3

Dobra odpowiedź. Jest to sposób 2015 r., Powyższy sposób wydaje się bardzo zbędny. –

0

Dlaczego nie można po prostu użyć singleton?

import android.content.Context; 


public class ClassicSingleton { 
    private Context c=null; 
    private static ClassicSingleton instance = null; 
    protected ClassicSingleton() 
    { 
     // Exists only to defeat instantiation. 
    } 
    public void setContext(Context ctx) 
    { 
    c=ctx; 
    } 
    public Context getContext() 
    { 
     return c; 
    } 
    public static ClassicSingleton getInstance() 
    { 
     if(instance == null) { 
      instance = new ClassicSingleton(); 
     } 
     return instance; 
    } 
} 

Następnie w klasie działalność:

private ClassicSingleton cs = ClassicSingleton.getInstance(); 

A w braku klasy działalności:

ClassicSingleton cs= ClassicSingleton.getInstance(); 
     Context c=cs.getContext(); 
     ImageView imageView = (ImageView) ((Activity)c).findViewById(R.id.imageView1); 
Powiązane problemy