私のアプリケーションには、多くのクラスとアクティビティがあります。 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オブジェクトに配置したいだけです。
コンテキストはシステムへのハンドルです。リソースの解決、データベースや設定へのアクセスの取得などのサービスを提供します。これは、アプリケーション固有のリソース、クラス、およびアプリケーション環境に関する情報へのアクセスを許可する「インターフェース」です。また、アクティビティとサービスは、コンテキストを拡張して、これらすべてのメソッドを継承し、アプリケーションが実行されている環境情報にアクセスします。
これは、リソースに関する特定の情報を取得/変更する場合、特定のクラスにコンテキストを渡す必要があることを意味します。次のようなコンストラクタでコンテキストを渡すことができます
public classname(Context context, String s1)
{
...
}
これに対する通常の解決策は、コンテキストのインスタンスを作成時にクラスに渡すか、最初に作成された後、コンテキストを使用する必要がある前にクラスに渡すことです。
もう1つの解決策は、静的メソッドを使用してアプリケーションオブジェクトを作成し、アプリケーションコンテキストにアクセスすることです。ただし、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" >
例:app_name文字列の取得:
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);
UがApplicationから拡張されるクラスを宣言していた場合、簡単に実行できます。
このクラスはシングルトンのようになるため、コンテキストが必要な場合は次のように取得できます。
これがより良い答えであり、クリーナーだと思います
Utilitiesパッケージのコードは次のとおりです。
public static String getAppNAme(){
return MyOwnApplication.getInstance().getString(R.string.app_name);
}