سؤال

لقد وجدت R.string رائع جدًا للحفاظ على السلاسل المتشددين من الكود الخاص بي ، وأود أن أستمر في استخدامه في فئة الأدوات المساعدة التي تعمل مع طرز في طلبي لإنشاء الإخراج. على سبيل المثال ، في هذه الحالة أقوم بإنشاء بريد إلكتروني من نموذج خارج النشاط.

هل من الممكن استخدام getString خارج أ Context أو Activity؟ أفترض أنه يمكنني المرور في النشاط الحالي ، لكن يبدو أنه غير ضروري. أرجوا أن تصحح لي إذا كنت مخطئا!

تحرير: هل يمكننا الوصول إلى الموارد بدون استخدام Context?

هل كانت مفيدة؟

المحلول

نعم ، يمكننا الوصول إلى الموارد دون استخدام "السياق"

يمكنك استخدام:

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

... في كل مكان في طلبك ، حتى في إعلانات الثوابت الثابتة. لسوء الحظ ، فإنه يدعم موارد النظام فقط.

لاستخدام الموارد المحلية هذا الحل. انها ليست تافهة ، لكنها تعمل.

نصائح أخرى

لسوء الحظ ، فإن الطريقة الوحيدة التي يمكنك من خلالها الوصول إلى أي من موارد السلسلة هي مع أ Context (أي Activity أو Service). ما قمت به عادة في هذه الحالة ، هو مجرد مطالبة المتصل بالمرور في السياق.

في MyApplication, الذي يمتد Application:

public static Resources resources;

في MyApplicationonCreate:

resources = getResources();

الآن يمكنك استخدام هذا الحقل من أي مكان في التطبيق الخاص بك.

راجع للشغل ، أحد سبب رمز لم يتم العثور عليه قد يكون الخطأ هو أن IDE المستورد Android.r ؛ الفصل بدلا من لك واحد. مجرد تغيير استيراد Android.R ؛ إلى استيراد your.namespace.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);
}

نهج فريد

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

هذا سوف يعمل في كل مكان في التطبيق. ((فئة UTIL أو مربع حوار أو جزء أو أي فصل في تطبيقك)

(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) في أي مكان في التطبيق.

إذا كان لديك فئة تستخدمها في نشاط ما وترغب في الوصول إلى Ressource في تلك الفئة ، فإنني أوصيك بتحديد سياق كمتغير خاص في الفصل وبينه الأولي في مُنشئ:

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

واسمحوا لي أن أعرف إذا رأيت أي شيء خاطئ هنا ، شكرا لك. قون

أفضل نهج من استجابة خميراج:

فئة التطبيق

class App : Application() {

    companion object {
        lateinit var instance: Application
        lateinit var resourses: Resources
    }


    // MARK: - Lifecycle

    override fun onCreate() {
        super.onCreate()
        instance = this
        resourses = resources
    }

}

إعلان في البيان

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

فئة الثوابت

class Localizations {

    companion object {
        val info = App.resourses.getString(R.string.info)
    }

}

استخدام

textView.text = Localizations.info

من الأفضل استخدام شيء كهذا بدون سياق الكلام و نشاط:

Resources.getSystem().getString(R.string.my_text)

إليك ما فعلته ، في النشاط الرئيسي ، قم بإنشاء متغير ثابت للسياق كما هو موضح أدناه:

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);إنه يعمل بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top