답변:
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)
정적 상수 선언에서도 응용 프로그램의 모든 곳에서 사용할 수 있습니다!
Toast
예를 들어 SharedPreference
라틴어 교사가 말한 것처럼 예 를 들어 인스턴스를 얻 거나 데이터베이스를 열 때 등 ).
내 Kotlin 솔루션은 정적 응용 프로그램 컨텍스트를 사용하는 것입니다.
class App : Application() {
companion object {
lateinit var instance: App private set
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
그리고 Strings 클래스는 모든 곳에서 사용합니다.
object Strings {
fun get(@StringRes stringRes: Int, vararg formatArgs: Any = emptyArray()): String {
return App.instance.getString(stringRes, *formatArgs)
}
}
따라서 리소스 문자열을 얻는 깔끔한 방법을 가질 수 있습니다
Strings.get(R.string.some_string)
Strings.get(R.string.some_string_with_arguments, "Some argument")
이 답변을 삭제하지 마십시오. 하나를 유지하겠습니다.
Strings
도움이되었습니다.
또 다른 가능성이 있습니다. 다음과 같은 리소스에서 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/...
변경 경로의 모든 리소스에 액세스 할 수 있습니다 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;
}
}
}
나는 FragmentActivity 내에서 정적 FragmentPagerAdapter의 getPageTitle (int position) 함수에 사용했으며, 이는 I8N 때문에 유용합니다.
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)
코드 어디에서나 사용하십시오 .더 많은 방법이 가능하다고 생각합니다. 그러나 때로는이 솔루션을 사용합니다. (전체 글로벌) :
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();
정적 함수에서 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();
}
API 레벨 27을 사용하고 있으며 약 이틀 동안 어려움을 겪고 나서 최상의 솔루션을 찾았습니다. Activity 또는 Application에서 파생되지 않은 클래스에서 xml 파일을 읽으려면 다음을 수행하십시오.
testdata.xml 파일을 자산 디렉토리 안에 넣으십시오.
테스트 데이터 문서를 구문 분석하려면 다음 코드를 작성하십시오.
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);
정적 함수 를 구현하는 클래스에서이 클래스에서 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');
상황이 있다면, 내면을 의미합니다.
public void onReceive(Context context, Intent intent){
}
이 코드를 사용하여 리소스를 얻을 수 있습니다.
context.getResources().getString(R.string.app_name);