ウィジェットでxml
のような他の多くのことを行う前に、setText
ファイルから文字列を読み取りたいので、getResources()
を呼び出すアクティビティオブジェクトなしでそれを行うにはどうすればよいですか。
Application
のサブクラスを作成します。たとえば、public class App extends Application {
Android:name
の<application>
タグのAndroidManifest.xml
属性を、新しいクラスを指すように設定します。 Android:name=".App"
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()
)を使用できます。
つかいます
Resources.getSystem().getString(Android.R.string.cancel)
静的定数宣言でも、アプリケーションのどこでも使用できます!ただし、システムリソースのみです!
別の可能性もあります。次のようなリソースから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)でリソースを読み込む方法も
シングルトン:
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()を使用できるようになります。また、アプリケーションサブクラスが使用できないごくわずかな場所でも使用できます。
ここで何かおかしいことがある場合はお知らせください。ありがとうございます。 :)
別の解決策:
非静的外部クラスに静的サブクラスがある場合、外部クラスの作成時に初期化する外部クラスの静的変数を介して、サブクラス内からリソースにアクセスできます。好む
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)関数に使用しました。
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)
を使用します。静的関数から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() : "";
}
...
}
public Static Resources mResources;
@Override
public void onCreate()
{
mResources = getResources();
}
もっと多くの方法が可能だと思います。しかし、時々、私はこのソリューションを使用しています。 (完全なグローバル):
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();
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');
私はAPIレベル27を使用していますが、約2日間苦労した後、最良のソリューションを見つけました。 ActivityまたはApplicationから派生していないクラスからxmlファイルを読み取りたい場合は、次を実行します。
Testdata.xmlファイルをassetディレクトリ内に配置します。
次のコードを記述して、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);
コンテキストがある場合は、内部を意味します。
public void onReceive(Context context, Intent intent){
}
このコードを使用してリソースを取得できます。
context.getResources().getString(R.string.app_name);