web-dev-qa-db-ja.com

静的コンテキストからリソースコンテンツを取得するにはどうすればよいですか?

ウィジェットでxmlのような他の多くのことを行う前に、setTextファイルから文字列を読み取りたいので、getResources()を呼び出すアクティビティオブジェクトなしでそれを行うにはどうすればよいですか。

156
lost baby
  1. Application のサブクラスを作成します。たとえば、public class App extends Application {
  2. Android:name<application>タグのAndroidManifest.xml属性を、新しいクラスを指すように設定します。 Android:name=".App"
  3. アプリインスタンスのonCreate()メソッドで、コンテキスト(thisなど)をmContextという名前の静的フィールドに保存し、このフィールドを返す静的メソッドを作成します。 getContext()

次のようになります。

public class App extends Application{

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
    }

    public static Context getContext(){
        return mContext;
    }
}

これで、コンテキストを取得したいときにいつでもApp.getContext()を使用でき、その後getResources()(またはApp.getContext().getResources())を使用できます。

363
Cristian

つかいます

Resources.getSystem().getString(Android.R.string.cancel)

静的定数宣言でも、アプリケーションのどこでも使用できます!ただし、システムリソースのみです!

98
Gangnus

別の可能性もあります。次のようなリソースからOpenGlシェーダーをロードします。

static private String vertexShaderCode;
static private String fragmentShaderCode;

static {
    vertexShaderCode = readResourceAsString("/res/raw/vertex_shader.glsl");
    fragmentShaderCode = readResourceAsString("/res/raw/fragment_shader.glsl");
}

private static String readResourceAsString(String path) {
    Exception innerException;
    Class<? extends FloorPlanRenderer> aClass = FloorPlanRenderer.class;
    InputStream inputStream = aClass.getResourceAsStream(path);

    byte[] bytes;
    try {
        bytes = new byte[inputStream.available()];
        inputStream.read(bytes);
        return new String(bytes);
    } catch (IOException e) {
        e.printStackTrace();
        innerException = e;
    }
    throw new RuntimeException("Cannot load shader code from resources.", innerException);
}

ご覧のとおり、パス/res/... Change aClassの任意のリソースにクラスにアクセスできます。これは、テスト(androidTests)でリソースを読み込む方法も

3
Gregory Stein

シングルトン:

package com.domain.packagename;

import Android.content.Context;

/**
 * Created by Versa on 10.09.15.
 */
public class ApplicationContextSingleton {
    private static PrefsContextSingleton mInstance;
    private Context context;

    public static ApplicationContextSingleton getInstance() {
        if (mInstance == null) mInstance = getSync();
        return mInstance;
    }

    private static synchronized ApplicationContextSingleton getSync() {
        if (mInstance == null) mInstance = new PrefsContextSingleton();
        return mInstance;
    }

    public void initialize(Context context) {
        this.context = context;
    }

    public Context getApplicationContext() {
        return context;
    }

}

Applicationサブクラスでシングルトンを初期化します。

package com.domain.packagename;

import Android.app.Application;

/**
 * Created by Versa on 25.08.15.
 */
public class mApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        ApplicationContextSingleton.getInstance().initialize(this);
    }
}

私が間違っていない場合、これはすべての場所でapplicationContextへのフックを提供し、ApplicationContextSingleton.getInstance.getApplicationContext();で呼び出します。アプリケーションを閉じるときにこれをクリアする必要があるため、いつでもこれをクリアする必要はありません。

AndroidManifest.xmlを更新して、このApplicationサブクラスを使用することを忘れないでください:

<?xml version="1.0" encoding="utf-8"?>

<manifest
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.domain.packagename"
    >

<application
    Android:allowBackup="true"
    Android:name=".mApplication" <!-- This is the important line -->
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme"
    Android:icon="@drawable/app_icon"
    >

これで、どこからでもApplicationContextSingleton.getInstance()。getApplicationContext()。getResources()を使用できるようになります。また、アプリケーションサブクラスが使用できないごくわずかな場所でも使用できます。

ここで何かおかしいことがある場合はお知らせください。ありがとうございます。 :)

3
Versa

別の解決策:

非静的外部クラスに静的サブクラスがある場合、外部クラスの作成時に初期化する外部クラスの静的変数を介して、サブクラス内からリソースにアクセスできます。好む

public class Outerclass {

    static String resource1

    public onCreate() {
        resource1 = getString(R.string.text);
    }

    public static class Innerclass {

        public StringGetter (int num) {
            return resource1; 
        }
    }
}

I8Nのために役立つFragmentActivity内の静的FragmentPagerAdapterのgetPageTitle(int position)関数に使用しました。

2
Stephan Brunker

ショートカット

App.getRes()の代わりにApp.getContext().getResources()を使用します(@Cristianが答えたように)

コードのどこでも簡単に使用できます!

したがって、ここに一意のソリューションがあり、これによりUtil classなどのどこからでもリソースにアクセスできます。

(1)Applicationクラスを作成または編集します。

import Android.app.Application;
import Android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

(2)名前フィールドをmanifest.xml<applicationタグに追加します。 (または既に存在する場合はこれをスキップします)

<application
        Android:name=".App"
        ...
        >
        ...
    </application>

これで準備完了です。

コードの任意の場所でApp.getRes().getString(R.string.some_id)を使用します。

2
Khemraj

静的関数からopenGL ESのシェーダーをロードします。

ファイル名とディレクトリ名には小文字を使用する必要があります。小文字を使用しないと、操作が失敗します

public class MyGLRenderer implements GLSurfaceView.Renderer {

    ...

    public static int loadShader() {
        //    Read file as input stream
        InputStream inputStream = MyGLRenderer.class.getResourceAsStream("/res/raw/vertex_shader.txt");

        //    Convert input stream to string
        Scanner s = new Scanner(inputStream).useDelimiter("\\A");
        String shaderCode = s.hasNext() ? s.next() : "";
    }

    ...

}
0
user2174870
public Static Resources mResources;

 @Override
     public void onCreate()
     {
           mResources = getResources();
     }
0
Makvin

もっと多くの方法が可能だと思います。しかし、時々、私はこのソリューションを使用しています。 (完全なグローバル):

    import Android.content.Context;

    import <your package>.R;

    public class XmlVar {

        private XmlVar() {
        }

        private static String _write_success;

        public static String write_success() {
            return _write_success;
        }


        public static void Init(Context c) {
            _write_success = c.getResources().getString(R.string.write_success);
        }
    }
//After activity created:
cont = this.getApplicationContext();
XmlVar.Init(cont);
//And use everywhere
XmlVar.write_success();
0
user2684935

static関数を実装するクラスでは、このクラスからprivate\publicメソッドを呼び出すことができます。 private\publicメソッドはgetResourcesにアクセスできます。

例:

public class Text {

   public static void setColor(EditText et) {
      et.resetColor(); // it works

      // ERROR
      et.setTextColor(getResources().getColor(R.color.Black)); // ERROR
   }

   // set the color to be black when reset
   private void resetColor() {
       setTextColor(getResources().getColor(R.color.Black));
   }
}

他のクラス\アクティビティから、次を呼び出すことができます。

Text.setColor('some EditText you initialized');
0
Maor Cohen

私はAPIレベル27を使用していますが、約2日間苦労した後、最良のソリューションを見つけました。 ActivityまたはApplicationから派生していないクラスからxmlファイルを読み取りたい場合は、次を実行します。

  1. Testdata.xmlファイルをassetディレクトリ内に配置します。

  2. 次のコードを記述して、testdataドキュメントを解析します。

        InputStream inputStream = this.getClass().getResourceAsStream("/assets/testdata.xml");
    
        // create a new DocumentBuilderFactory
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // use the factory to create a documentbuilder
        DocumentBuilder builder = factory.newDocumentBuilder();
        // create a new document from input stream
        Document doc = builder.parse(inputStream);
    
0
Jnana

コンテキストがある場合は、内部を意味します。

public void onReceive(Context context, Intent intent){

}

このコードを使用してリソースを取得できます。

context.getResources().getString(R.string.app_name);
0
eren130