web-dev-qa-db-ja.com

コンテキストを持たないクラスからgetResources()を呼び出す方法は?

私のアプリケーションには、多くのクラスとアクティビティがあります。 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オブジェクトに配置したいだけです。

59
andro-girl

コンテキストはシステムへのハンドルです。リソースの解決、データベースや設定へのアクセスの取得などのサービスを提供します。これは、アプリケーション固有のリソース、クラス、およびアプリケーション環境に関する情報へのアクセスを許可する「インターフェース」です。また、アクティビティとサービスは、コンテキストを拡張して、これらすべてのメソッドを継承し、アプリケーションが実行されている環境情報にアクセスします。

これは、リソースに関する特定の情報を取得/変更する場合、特定のクラスにコンテキストを渡す必要があることを意味します。次のようなコンストラクタでコンテキストを渡すことができます

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

これに対する通常の解決策は、コンテキストのインスタンスを作成時にクラスに渡すか、最初に作成された後、コンテキストを使用する必要がある前にクラスに渡すことです。

もう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" >
29
zeetoobiker

例:app_name文字列の取得:

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

これは私にとって常に機能します:

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

UがApplicationから拡張されるクラスを宣言していた場合、簡単に実行できます。

このクラスはシングルトンのようになるため、コンテキストが必要な場合は次のように取得できます。

これがより良い答えであり、クリーナーだと思います

Utilitiesパッケージのコードは次のとおりです。

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