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

Android 如何从没有上下文的类调用getResources()?,android,class,background,android-context,Android,Class,Background,Android Context,在我的申请中,我有很多课程和活动。Droid是一个没有上下文的类。Mygame是一个扩展SurfaceView并实现SurfaceHolder.Callback的类。 我正在mygame类中创建一个Droid对象,并为其设置背景图像和位置。下面给出了我为此编写的代码 block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10); public Droid(Bitmap

在我的申请中,我有很多课程和活动。Droid是一个没有上下文的类。Mygame是一个扩展SurfaceView并实现SurfaceHolder.Callback的类。 我正在mygame类中创建一个Droid对象,并为其设置背景图像和位置。下面给出了我为此编写的代码

block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10);
public Droid(Bitmap bitmap, int x, int y) {

    this.bitmap = bitmap;
    this.x = x;
    this.y = y;
}   
Droid类的构造函数如下所示

block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10);
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对象定位它

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

另一个解决方案是使用静态方法创建一个应用程序对象来访问应用程序上下文,尽管这样会将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();
    }
}
<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:name=".App" >
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);
并在需要上下文的任何地方调用App.context()——但是请注意,并非所有函数都在应用程序上下文中可用,有些函数仅在活动上下文中可用,但它肯定会满足您对getResources()的需求

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

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();
    }
}
<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:name=".App" >
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);

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

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

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

示例:获取应用程序名称字符串:

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 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();
    }
}
<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:name=".App" >
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);

如果您声明了一个从应用程序扩展而来的类,则可以很容易地完成此操作

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

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();
    }
}
<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:name=".App" >
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);
我认为这是更好的答案,更干净

以下是我的实用程序包代码:

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

usindandroid位图还提供了与android代码的紧密耦合。我通常会尝试将界面相关代码和特定于应用程序的东西分开(我不是很成功)@zeetoobiker…你能解释一下这些事情吗?我不明白。我对android不太熟悉。我并不是说要与android代码紧密耦合(假设你用静态方法让它访问应用程序对象),相反,Droid类将与它当前所在的项目紧密耦合——如果不重新编写内部构件,您将无法在不同的项目中使用它。老实说,Android应用程序中处理显示功能的类将与Android紧密耦合,因此我不必担心。seethalakshim-我在答案中添加了一些示例,希望能对此进行更多解释。Findbugs说,从实例方法编写静态变量通常是不好的做法,考虑到这是Android特有的东西,我很好奇为什么这种方法可以。是否可以为Droid类设置上下文…它不是扩展活动或任何其他类它不需要扩展活动。当从某些活动初始化此类时,您可以将上下文传递给此类。这只使用系统资源,而不使用应用程序资源-在99%的情况下,这不会起作用是的…这对我也不起作用。我需要访问应用程序资源,以便将枚举转换为字符串,但找不到这些字符串。最终不得不创建一个函数,该函数将枚举映射到一个资源,并使用了本文其他部分所述的活动。的可能重复项