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

and*_*irl 61 android background class android-context

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

block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10);
Run Code Online (Sandbox Code Playgroud)

Droid类的构造函数如下.

public Droid(Bitmap bitmap, int x, int y) {

    this.bitmap = bitmap;
    this.x = x;
    this.y = y;
}   
Run Code Online (Sandbox Code Playgroud)

在一个特定的场景中,我必须从Droid类本身设置Droid对象的背景图像和位置.我正面临着这个问题.下面给出的是执行此操作的代码片段.

if(checkflag)
{
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}   
Run Code Online (Sandbox Code Playgroud)

问题是Droid类没有上下文.所以我不能在这里使用getResources().我已经尝试了下面的代码,但它崩溃了.

if(checkflag)
{
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(myObj.getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}
Run Code Online (Sandbox Code Playgroud)

有谁能够帮我.我只想设置背景图像并将其放置在Droid类本身的Droid对象中.

Ali*_*Ali 55

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

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

public classname(Context context, String s1) 
{
...
}
Run Code Online (Sandbox Code Playgroud)

  • 它不需要扩展活动.在从某个活动初始化此类时,您可以将上下文传递给此类. (2认同)

zee*_*ker 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;
    }   
Run Code Online (Sandbox Code Playgroud)

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且在需要上下文的地方调用App.context() - 但是请注意,并非所有函数都在应用程序上下文中可用,有些仅在活动上下文中可用,但它肯定会满足您对getResources()的需求.

请注意,您需要在清单中的应用程序定义中添加android:name,如下所示:

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:name=".App" >
Run Code Online (Sandbox Code Playgroud)


小智 25

示例:获取app_name字符串:

Resources.getSystem().getString( R.string.app_name )
Run Code Online (Sandbox Code Playgroud)

  • 这仅使用系统资源,而不是应用程序资源 - 在99%的情况下将不起作用 (17认同)