如何从没有上下文的类中调用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); }