在我的应用程序中,我有很多课程和活动。 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对象中。
答案 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);
}