Подтвердить что ты не робот

Как вызвать getResources() из класса, который не имеет контекста?

В моем приложении у меня много классов и видов деятельности. Droid - это класс, который не имеет контекста. Mygame - это класс, который расширяет SurfaceView и реализует SurfaceHolder.Callback. Я создаю объект Droid в классе mygame и устанавливаю фоновое изображение и позицию для него. Код, который я написал для этого, приведен ниже.

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

Конструктор класса Droid приведен ниже.

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

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

В конкретном сценарии я должен установить фоновое изображение и положение объекта Droid из самого класса Droid. Вот я столкнулся с проблемой. Ниже приведен фрагмент кода для этого.

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

Проблема заключается в том, что класс Droid не имеет контекста. Поэтому я не могу использовать getResources() здесь. Я пробовал код ниже, но он сбой.

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

Может кто-нибудь мне помочь. Я просто хочу установить фоновое изображение и поместить его для объекта Droid из самого класса Droid.

4b9b3361

Ответ 1

A Контекст - это дескриптор системы; он предоставляет такие услуги, как разрешение ресурсов, получение доступа к базам данных и предпочтениям и т.д. Это "интерфейс", который позволяет получить доступ к конкретным ресурсам приложения и классу и информации о среде приложения. Ваши действия и службы также расширяют контекст, чтобы наследовать все эти методы для доступа к информации о среде, в которой работает приложение.

Это означает, что вам необходимо передать контекст конкретному классу, если вы хотите получить/изменить некоторую конкретную информацию о ресурсах. Вы можете передать контекст в конструкторе, например

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

Ответ 2

Обычным решением для этого является передача экземпляра контекста в класс по мере его создания или после его создания, но прежде чем вам понадобится использовать контекст.

Другим решением является создание объекта приложения со статическим методом для доступа к контексту приложения, хотя он довольно тесно соединяет объект Droid с кодом.

Изменить, добавленные примеры

Либо измените класс Droid на что-то вроде этого

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

Или создайте приложение примерно так:

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

И вызовите App.context() везде, где вам нужен контекст - обратите внимание, однако, что не все функции доступны в контексте приложения, некоторые из них доступны только в контексте активности, но это, безусловно, будет связано с вашей потребностью в getResources().

Обратите внимание, что вам нужно будет добавить android: name в определение вашего приложения в своем манифесте, примерно так:

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

Ответ 3

Пример: Получение строки app_name:

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

Ответ 4

Это всегда работает для меня:

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

}

Не связано с этим вопросом, но пример с использованием фрагмента для доступа к системным ресурсам/активности следующим образом:

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

Ответ 5

Это легко сделать, если u объявил класс, который простирается от приложения

Этот класс будет похож на синглтон, поэтому, когда вам нужен контекст, вы можете получить его так:

Я думаю, что это лучший ответ и более чистый

Вот мой код из пакета Utilities:

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