2012-10-29 16 views
37

Voglio ottenere la vista o findViewById() dal contesto? O dall'intenzione?android - Come ottenere la vista dal contesto?

Sto provando a raggiungere una vista specifica nel mio ricevitore broadcast e il parametro di onReceive è contesto e intento.

Bene, ho una classe e al suo interno è il mio ricevitore di trasmissione. Ora sto cercando di separare il ricevitore della trasmissione da esso, ma ho bisogno di un modo per poter comunicare con le viste della mia classe dalla mia classe di ricevitore broadcast separata.

Grazie.

risposta

5

Nel ricevitore radio della quale si potrebbe accedere a una vista tramite l'inflazione un layout radice da risorse XML e quindi trovare tutte le viste da questo layout radice con findViewById():

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

Ora è possibile accedere le vostre opinioni tramite 'view' e li getteranno al vostro tipo di visualizzazione:

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

quello che dovrebbe essere posi sul parametro root? Il parametro radice – lorraine

+0

è una vista radice della gerarchia gonfiata. Nell'esempio sopra ho mostrato come gonfiare una vista che è già una radice quindi puoi mantenere questo parametro falso. Se la tua vista inflazionata non è una radice, allora inserisci la tua vista di root come terzo parametro. –

+3

Non dovrebbe essere 'nullo' invece di' falso'? – Roberto

43

Partendo da un contesto, la vista radice l'attività associata può essere avuto da

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

In Raw Android che sarebbe simile al seguente:

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

Poi basta chiamare il findViewById su questo

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

Ricorda che dovresti eseguire il cast di 'View v = rootView.findViewById (R.id.your_view_id);' to' View v = (View) rootView.findViewById (R.id.your_view_id); 'e la classe _View_ può essere una qualsiasi classe derivata di View. –

+1

Durante il tentativo, viene visualizzato "Causato da: java.lang.ClassCastException: android.app.Application non può essere trasmesso su android.app.Activity". – drynyn

+2

@drynyn perché in questo esempio si presuppone che venga passata un'attività per il contesto, che non è un'ipotesi sicura. È possibile utilizzare la parola chiave instanceof per verificare se il cast è sicuro da eseguire o meno. (google "instanceof java" per gli esempi). – eimmer

1

primo utilizzo questo:

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)); 

allora si può usare questo per trovare qualsiasi elemento nel layout.

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

Per esempio è possibile trovare qualsiasi textView:

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

Buona risposta. Questo è il modo di farlo nel 2015, il modo sopra descritto sembra molto ridondante. –

0

Perché non basta usare un 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; 
    } 
} 

Poi nella classe di attività:

private ClassicSingleton cs = ClassicSingleton.getInstance(); 

E nella classe di attività non:

ClassicSingleton cs= ClassicSingleton.getInstance(); 
     Context c=cs.getContext(); 
     ImageView imageView = (ImageView) ((Activity)c).findViewById(R.id.imageView1); 
Problemi correlati