[java] 컨텍스트 또는 활동 외부의 getString

R.string하드 코드 된 문자열을 코드에서 유지하는 것이 매우 훌륭 하다는 것을 알았으며 응용 프로그램의 모델과 함께 작동하여 출력을 생성하는 유틸리티 클래스에서 계속 사용하고 싶습니다. 예를 들어,이 경우 활동 외부의 모델에서 이메일을 생성합니다.

또는 getString밖에서 사용할 수ContextActivity 있습니까? 현재 활동을 통과 할 수 있다고 생각하지만 불필요한 것 같습니다. 내가 틀렸다면 정정 해주세요!

편집 : 우리는 사용 하지 않고 리소스에 액세스 할 수 있습니까 Context?



답변

예, 컨텍스트를 사용하지 않고도 리소스에 액세스 할 수 있습니다

당신이 사용할 수있는:

Resources.getSystem().getString(android.R.string.somecommonstuff)

… 정적 상수 선언에서도 응용 프로그램의 모든 곳에서. 불행히도 시스템 리소스 만 지원 합니다 .

로컬 리소스의 경우이 솔루션을 사용 하십시오 . 사소한 것이 아니지만 작동합니다.


답변

불행히도 문자열 리소스에 액세스 할 수있는 유일한 방법은 Context( Activity또는 Service)를 사용하는 것입니다. 이 경우에 일반적으로 한 일은 단순히 호출자가 컨텍스트를 전달하도록 요구하는 것입니다.


답변

에서 MyApplication확장 Application:

public static Resources resources;

에서 MyApplication의 ‘ onCreate:

resources = getResources();

이제 응용 프로그램의 어느 곳에서나이 필드를 사용할 수 있습니다.


답변

BTW, symbol not found 오류 의 원인 중 하나는 IDE가 android.R을 가져 왔기 때문일 수 있습니다. 당신 대신 하나의 수업. 가져 오기 android.R을 변경하십시오 . your.namespace.R가져 오려면;

따라서 다른 클래스에서 문자열을 볼 수있는 두 가지 기본 사항 :

//make sure you are importing the right R class
import your.namespace.R;

//don't forget about the context
public void some_method(Context context) {
   context.getString(R.string.YOUR_STRING);
}


답변

독특한 접근법

App.getRes().getString(R.string.some_id)

이것은 응용 프로그램의 모든 곳에서 작동합니다. ( Util class, Dialog, Fragment 또는 앱의 모든 클래스 )

(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)앱 어디에서나 사용하십시오 .


답변

활동에 사용하는 클래스가 있고 해당 클래스의 리소스에 액세스하려는 경우 컨텍스트를 클래스의 개인 변수로 정의하고 생성자에서 초기화하는 것이 좋습니다.

public class MyClass (){
    private Context context;

    public MyClass(Context context){
       this.context=context;
    }

    public testResource(){
       String s=context.getString(R.string.testString).toString();
    }
}

당신의 활동에서 수업의 순간을 만들기 :

MyClass m=new MyClass(this);


답변

이를 applicationContext통해 어디서나 액세스 할 수 있어야 applicationContext합니다. Toast, getString(), sharedPreferences, 등

싱글 톤 :

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);
    }
}

내가 틀리지 않으면 응용 프로그램 컨텍스트에 대한 연결 고리를 제공합니다. ApplicationContextSingleton.getInstance.getApplicationContext();
어플리케이션을 닫을 때와 같이 언제든지 지울 필요는 없습니다.

AndroidManifest.xmlApplication서브 클래스 를 사용 하도록 업데이트하십시오 :

<?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"
    >

여기에 잘못된 것이 있으면 알려주십시오. 감사합니다. 🙂