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

时间:2011-11-23 07:30:25

标签: android class background android-context

在我的应用程序中,我有很多课程和活动。 Droid是一个没有上下文的类。 Mygame是一个扩展SurfaceView并实现SurfaceHolder.Callback的类。 我在mygame类中创建了一个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对象中。

5 个答案:

答案 0 :(得分:55)

Context是系统的句柄;它提供诸如解析资源,获取对数据库和首选项的访问等服务。它是一个“接口”,允许访问应用程序特定的资源以及有关应用程序环境的类和信息。您的活动和服务还会将Context扩展为继承所有这些方法以访问运行应用程序的环境信息。

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

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

答案 1 :(得分:29)

对此的正常解决方案是在创建时将上下文的实例传递给类,或者在首次创建之后但在需要使用上下文之前将其传递给类。

另一个解决方案是创建一个带有静态方法的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" >

答案 2 :(得分:25)

示例:获取app_name字符串:

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

答案 3 :(得分:1)

这对我来说总是有用的:

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

}

与此问题无关,但使用Fragment访问系统资源/活动的示例如下:

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

答案 4 :(得分:0)

如果你声明了一个从Application

扩展的类,那么很容易就可以完成

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

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

以下是我的代码来自Utilities包:

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