如何从没有上下文的类中调用getResources()?

在我的应用程序中,我有许多课程和活动。 Droid是一个没有上下文的类。 Mygame是一个扩展SurfaceView并实现SurfaceHolder.Callback的类。 我在mygame类中创build了一个Droid对象,并为其设置背景图像和位置。 我为此编写的代码如下所示。

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对象的位置。

上下文是系统的句柄; 它提供的服务包括parsing资源,访问数据库和首选项等等。 它是一个“接口”,允许访问特定于应用程序的资源和类以及有关应用程序环境的信息。 您的活动和服务还将Context扩展到inheritance所有这些方法以访问运行该应用程序的环境信息。

这意味着如果您想获取/修改关于资源的某些特定信息,则必须将上下文传递给特定的类。 你可以像构造函数那样传递上下文

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

正常的解决scheme是在上下文创build时,或者在第一次创build之后,在需要使用上下文之前,将上下文的实例传递给类。

另一个解决scheme是使用静态方法创build一个Application对象来访问应用程序上下文,尽pipe它将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; } 

或者像这样创build一个应用程序:

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

示例:获取app_namestring:

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

这总是适合我:

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

如果你已经申请了一个从Application扩展的类,那么很容易做到

这个类将会像一个单例,所以当你需要一个上下文时,你可以像这样获得它:

我认为这是更好的答案和更清洁

这是我从公用程序包的代码:

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