37

Ich möchte die Ansicht oder findViewById() von Kontext abrufen? Oder aus Absicht?android - Wie man aus dem Kontext sehen?

Ich versuche, eine bestimmte Ansicht in meinem Broadcast-Empfänger zu erreichen, und der Parameter onReceive sind Kontext und Absicht.

Nun, ich habe eine Klasse und darin ist mein Rundfunkempfänger. Jetzt versuche ich, den Rundfunkempfänger davon zu trennen, aber ich brauche einen Weg, damit ich immer noch mit den Ansichten meiner Klasse aus meiner getrennten Rundfunkempfänger-Klasse kommunizieren kann.

Danke.

Antwort

5

In Ihrem Rundfunkempfänger können Sie einen Blick über die Inflation ein Root-Zugriff auf das Layout von XML-Ressource und dann mit findViewById alle Ihre Ansichten von dieser Wurzel Layout finden():

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

Jetzt können Sie Ihre Ansichten Zugriff über ‚view‘ und sie zu Ihrer Ansicht Typ Stimmen:

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

Was sollte ich auf Root-Parameter gesetzt? – lorraine

+0

Root-Parameter ist eine Root-Ansicht der überhöhten Hierarchie. Im obigen Beispiel habe ich gezeigt, wie man eine Ansicht aufbläht, die bereits eine Wurzel ist, daher kann man diesen Parameter falsch halten. Wenn Ihre aufgeblähte Ansicht kein Stamm ist, platzieren Sie Ihre Stammansicht als dritten Parameter. –

+3

Sollte das nicht "null" statt "falsch" sein? – Roberto

43

mit einem Kontext starten, die Stammansicht der zugehörigen Aktivität kann durch

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

In Raw Android es so etwas wie aussehen würde:

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

Dann rufen Sie einfach die findViewById auf dieser

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

Denken Sie daran, dass Sie 'View v = rootView.findViewById (R.id.your_view_id);' zu 'View v = (View) rootView.findViewById (R.id.your_view_id); 'und die Klasse _View_ kann eine abgeleitete Klasse von View sein. –

+1

Beim Versuch bekomme ich "verursacht durch: java.lang.ClassCastException: android.app.Application kann nicht in android.app.Activity umgewandelt werden". – drynyn

+2

@drynyn Das liegt daran, dass in diesem Beispiel angenommen wird, dass eine Aktivität für den Kontext übergeben wird, was keine sichere Annahme ist. Sie können das Schlüsselwort instanceof verwenden, um zu überprüfen, ob der Cast sicher ausgeführt werden kann oder nicht. (google "instanceof java" für Beispiele). – eimmer

1

ersten Verwendung dieses:

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

dann können Sie diese verwenden um irgendein Element im Layout zu finden.

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

Zum Beispiel können Sie eine beliebige Textview finden:

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

Gute Antwort. Dies ist die Art und Weise, wie es 2015 gemacht wird, der obige Weg scheint sehr redundant zu sein. –

0

Warum nutzen Sie nicht nur ein 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; 
    } 
} 

Dann in der Aktivitätsklasse:

private ClassicSingleton cs = ClassicSingleton.getInstance(); 

Und in der nicht Aktivitätsklasse:

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