Как вызвать 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.
Ответы
Ответ 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);
}