it-swarm.com.de

Wie rufe ich getResources () von einer Klasse ohne Kontext auf?

In meiner Bewerbung habe ich viele Kurse und Aktivitäten. Droid ist eine Klasse, die keinen Kontext hat. Mygame ist eine Klasse, die SurfaceView erweitert und SurfaceHolder.Callback ..__ implementiert. Ich erstelle ein Objekt von Droid in der Mygame-Klasse und setze das Hintergrundbild und die Position dafür. Der Code, den ich dafür geschrieben habe, ist unten angegeben.

block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10);

Der Konstruktor der Droid-Klasse ist unten angegeben.

public Droid(Bitmap bitmap, int x, int y) {

    this.bitmap = bitmap;
    this.x = x;
    this.y = y;
}   

In einem bestimmten Szenario muss ich das Hintergrundbild und die Position des Droid-Objekts aus der Droid-Klasse selbst festlegen. Hier stehe ich vor dem Problem. Im Folgenden wird der Code-Ausschnitt dargestellt, der dies tut.

if(checkflag)
{
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}   

Das Problem ist, dass die Droid-Klasse keinen Kontext hat. Daher kann ich hier nicht getResources () verwenden. Ich habe den folgenden Code ausprobiert, aber er stürzt ab.

if(checkflag)
{
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(myObj.getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}

Kann mir jemand helfen. Ich möchte nur das Hintergrundbild festlegen und es für das Droid-Objekt aus der Droid-Klasse selbst positionieren. 

57
andro-girl

Ein Kontext ist ein Handle für das System. Es bietet Dienste wie das Auflösen von Ressourcen, den Zugriff auf Datenbanken und Präferenzen usw. an. Es ist eine "Schnittstelle", die den Zugriff auf anwendungsspezifische Ressourcen, Klassen und Informationen zur Anwendungsumgebung ermöglicht. Ihre Aktivitäten und Dienste erweitern außerdem Kontext, um alle diese Methoden zu erben, um auf die Umgebungsinformationen zuzugreifen, in denen die Anwendung ausgeführt wird.

Das bedeutet, dass Sie den Kontext an die bestimmte Klasse übergeben müssen, wenn Sie bestimmte Informationen zu den Ressourcen abrufen oder ändern möchten. Sie können den Kontext im Konstruktor ähnlich übergeben

public classname(Context context, String s1) 
{
...
}
52
Ali

Die normale Lösung hierfür ist, eine Instanz des Kontextes an die Klasse zu übergeben, wenn Sie sie erstellen oder nachdem sie erstellt wurde, aber bevor Sie den Kontext verwenden müssen.

Eine andere Lösung besteht darin, ein Anwendungsobjekt mit einer statischen Methode zu erstellen, um auf den Anwendungskontext zuzugreifen, obwohl das Droid-Objekt ziemlich eng mit dem Code gekoppelt ist.

Bearbeiten, hinzugefügte Beispiele

Ändern Sie entweder die Droid-Klasse so, dass sie ungefähr so ​​aussieht

 public Droid(Context context,int x, int y) {
    this.bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.birdpic);
    this.x = x;
    this.y = y;
    }   

Oder erstellen Sie eine Anwendung in etwa wie folgt:

public class App extends Android.app.Application
{
    private static App mApp = null;
    /* (non-Javadoc)
     * @see Android.app.Application#onCreate()
     */
    @Override
    public void onCreate()
    {
        super.onCreate();
        mApp = this;
    }
    public static Context context()
    {
        return mApp.getApplicationContext();
    }
}

Und rufen Sie App.context () auf, wo immer Sie einen Kontext benötigen. Beachten Sie jedoch, dass nicht alle Funktionen in einem Anwendungskontext verfügbar sind. Einige sind nur in einem Aktivitätskontext verfügbar. Dies ist jedoch mit der Notwendigkeit von getResources () verbunden.

Bitte beachten Sie, dass Sie der Anwendungsdefinition in Ihrem Manifest den Namen Android: hinzufügen müssen, etwa wie folgt:

<application
    Android:icon="@drawable/icon"
    Android:label="@string/app_name"
    Android:name=".App" >
28
zeetoobiker

Beispiel: App_name-String abrufen:

Resources.getSystem().getString( R.string.app_name )
25
clive

Das funktioniert immer bei mir:

import Android.app.Activity;
import Android.content.Context;

public class yourClass {

 Context ctx;

 public yourClass (Handler handler, Context context) {
 super(handler);
    ctx = context;
 }

 //Use context (ctx) in your code like this:
 block1 = new Droid(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic), 100, 10);
 //OR
 builder.setLargeIcon(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic));
 //OR
 final Intent intent = new Intent(ctx, MainActivity.class);
 //OR
 NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
 //ETC...

}

Nicht auf diese Frage bezogen, sondern ein Beispiel, bei dem ein Fragment verwendet wird, um auf Systemressourcen/Aktivitäten wie folgt zuzugreifen:

public boolean onQueryTextChange(String newText) {
 Activity activity = getActivity();
 Context context = activity.getApplicationContext();
 returnSomething(newText);
 return false;
}

View customerInfo = getActivity().getLayoutInflater().inflate(R.layout.main_layout_items, itemsLayout, false);
 itemsLayout.addView(customerInfo);
1
Elroy

Es ist leicht möglich, wenn Sie eine Klasse deklariert haben, die sich von Application erstreckt

Diese Klasse wird wie ein Einzelspieler sein. Wenn Sie also einen Kontext benötigen, können Sie ihn wie folgt erhalten:

Ich denke, das ist die bessere Antwort und der Reiniger

Hier ist mein Code aus dem Hilfsprogrammpaket:

 public static String getAppNAme(){
     return MyOwnApplication.getInstance().getString(R.string.app_name);
 }
0
Catluc