Jak wywołać getResources () z klasy, która nie ma kontekstu?

W mojej aplikacji mam wiele zajęć i zajęć. Droid jest klasą, która nie ma kontekstu. Mygame jest klasą, która rozszerza SurfaceView i implementuje SurfaceHolder./ Align = "left" / Tworzę obiekt Droida w klasie mygame i ustawiam dla niego obraz tła i pozycję. Kod, który napisałem do tego jest podany poniżej.

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

Konstruktor klasy droidów jest podany poniżej.

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

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

W konkretnym scenariuszu muszę ustawić obraz tła i pozycja obiektu Droida z samej klasy droidów.Tutaj mam do czynienia z problemem.Poniżej znajduje się fragment kodu, aby to zrobić.

if(checkflag)
{
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}   
Problem w tym, że Klasa droidów nie ma kontekstu. Więc nie mogę użyć getResources() tutaj. Próbowałem poniższego kodu, ale się zawiesza.
if(checkflag)
{
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(myObj.getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}
Czy ktoś może mi pomóc? Chcę tylko ustawić obraz tła i ustawić go dla obiektu Droida z samej klasy Droida.
Author: Brian Tompsett - 汤莱恩, 2011-11-23

5 answers

Kontekst to Uchwyt systemu; zapewnia usługi takie jak rozwiązywanie zasobów, uzyskiwanie dostępu do baz danych i preferencji itd. Jest to "interfejs", który umożliwia dostęp do konkretnych zasobów i klas aplikacji oraz informacji o środowisku aplikacji. Twoje działania i usługi rozszerzają również kontekst do dziedziczenia wszystkich tych metod, aby uzyskać dostęp do informacji o środowisku, w którym uruchomiona jest aplikacja.

Oznacza to, że musisz przekazać kontekst do konkretna Klasa, jeśli chcesz uzyskać / zmodyfikować jakieś konkretne informacje o zasobach. Możesz przekazać kontekst w konstruktorze jak

public classname(Context context, String s1) 
{
...
}
 52
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 08:14:52

Normalnym rozwiązaniem jest przekazanie instancji kontekstu do klasy podczas jej tworzenia lub po jej utworzeniu, ale przed koniecznością użycia kontekstu.

Innym rozwiązaniem jest stworzenie obiektu aplikacji za pomocą statycznej metody dostępu do kontekstu aplikacji, chociaż obiekt Droid dość ściśle łączy się z kodem.

Edit, examples added

Albo zmodyfikować klasę droidów, aby była czymś takim

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

Lub utworzyć aplikacja coś takiego:

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

I zadzwoń do aplikacji.context () wherever you need a context-zauważ jednak, że nie wszystkie funkcje są dostępne w kontekście aplikacji, niektóre są dostępne tylko w kontekście aktywności, ale to z pewnością pomoże Ci w potrzebie getresources ().

Pamiętaj, że musisz dodać nazwę android: do definicji aplikacji w manifeście, coś w tym stylu:

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:name=".App" >
 28
Author: zeetoobiker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-24 14:32:42

Przykład: uzyskanie ciągu nazw aplikacji:

Resources.getSystem().getString( R.string.app_name )
 24
Author: clive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-25 14:22:58

To zawsze działa dla mnie:

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...

}

Nie związane z tym pytaniem, ale przykład użycia fragmentu, aby uzyskać dostęp do zasobów systemowych / działania w ten sposób:

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
Author: Elroy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-21 12:46:31

Można to łatwo zrobić, jeśli u zadeklarował klasę, która rozciąga się z aplikacji

Ta klasa będzie jak singleton, więc kiedy potrzebujesz kontekstu, możesz ją uzyskać w następujący sposób:

Myślę, że to jest lepsza odpowiedź i czystsze

Oto Mój kod z pakietu Utilities:

 public static String getAppNAme(){
     return MyOwnApplication.getInstance().getString(R.string.app_name);
 }
 0
Author: Catluc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-05 14:59:45