Как вызвать getResources () из класса, который не имеет контекста? - PullRequest
59 голосов
/ 23 ноября 2011

В моем приложении у меня много занятий и занятий. 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.

Ответы [ 5 ]

55 голосов
/ 23 ноября 2011

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

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

public classname(Context context, String s1) 
{
...
}
29 голосов
/ 23 ноября 2011

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

Другим решением является создание объекта Application со статическим методом для доступа к контексту приложения, хотя это довольно тесно связывает объект 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" >
25 голосов
/ 25 февраля 2013

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

Resources.getSystem().getString( R.string.app_name )
1 голос
/ 21 февраля 2015

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

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);
0 голосов
/ 05 октября 2016

Это легко сделать, если вы объявили класс, который выходит из Application

Этот класс будет похож на одиночный, поэтому, когда вам нужен контекст, вы можете получить его так:1004 * Я думаю, что это лучший ответ и чище

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

 public static String getAppNAme(){
     return MyOwnApplication.getInstance().getString(R.string.app_name);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...