getString вне контекста или действия


я нашел R.string довольно удивительным для хранения жестко закодированных строк из моего кода, и я хотел бы продолжать использовать его в служебном классе, который работает с моделями в моем приложении для создания вывода. Например, в этом случае я генерирую электронное письмо из модели за пределами действия.

можно использовать getString за пределами Context или Activity? Полагаю, я мог бы пройти в текущей деятельности, но это кажется ненужным. Пожалуйста, поправьте меня, если я неправильно!

Edit: можем ли мы получить доступ к ресурсам без используя Context?

9 195

9 ответов:

Да, мы можем получить доступ к ресурсам без использования 'Context'

вы можете использовать:

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

... везде в вашем приложении, даже в объявлениях статических констант. К сожалению, он поддерживает только системные ресурсы.

для использования местных ресурсов данное решение. Это не тривиально, но это работает.

к сожалению, единственный способ получить доступ к любому из строковых ресурсов-это Context (т. е. Activity или Service). То, что я обычно делал в этом случае, - это просто требовать, чтобы вызывающий передал в контексте.

на MyApplication, которая расширяет Application:

public static Resources resources;

на MyApplication ' s onCreate:

resources = getResources();

теперь вы можете использовать это поле в любом месте вашего приложения.

кстати, одна из причин символ не найден ошибка может заключаться в том, что ваша IDE импортировала android.R; класс вместо вашего одного. Просто изменить импорт android.R; до импорт.пространство имен.R;

Итак, 2 основные вещи, чтобы получить строку, видимую в другом классе:

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

Если у вас есть класс, который вы используете в действии, и вы хотите иметь доступ к ресурсу в этом классе, я рекомендую вам определить контекст как закрытую переменную в классе и инициализировать его в конструкторе:

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

если я не ошибаюсь, это дает вам крючок к 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"
    >

пожалуйста, дайте мне знать, если вы видите что-то не так здесь, Спасибо. :)

Лучший Подход

как @Гангнус ответил, но это решение только для ресурсов по умолчанию в Android.

я использую App.getRes().getString(R.string.some_id), что будет работать везде в приложении.

что? Он очень прост в использовании в любом месте вашего приложения!

так вот уникальное решение С помощью которого вы можете получить доступ к ресурсам из любого места, как 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) в любом месте в приложение.

вот что я сделал, В MainActivity создайте статическую переменную для контекста, как показано ниже:

public static Context mContext;

и в onCreate() инициализировать mContext к этому;

mContext = this;

затем, в файле, где вы хотите получить доступ к контексту, скажем,

private Context context = MainActivity.mContext;

теперь вы можете получить строковый ресурс следующим образом:

String myString = context.getResources().getString(R.string.resource_id);

Я getContext().getApplicationContext().getString(R.string.nameOfString); Это работает на меня.