676 Stimmen

Android: Wie erhalte ich eine Zeichenkette aus einer Ressource anhand ihres Namens?

Ich möchte 2 Sprachen für die UI und separate Zeichenfolgenwerte für sie in meiner Ressourcendatei haben res\values\strings.xml :

<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>

<string name="tab_Books_ru"></string>
<string name="tab_Quotes_ru"></string>
<string name="tab_Questions_ru"></string>
<string name="tab_Notes_ru"></string>
<string name="tab_Bookmarks_ru"></string>

Jetzt muss ich diese Werte dynamisch in meiner Anwendung abrufen:

spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);

Mein Problem ist, dass i = 0 .

Warum funktioniert es in meinem Fall nicht?

22voto

Khemraj Sharma Punkte 52006

Beste Annäherung

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

Wird überall funktionieren (Utils, Models auch).

Ich habe alle Antworten gelesen, alle Antworten können Ihre Arbeit erledigen.

  • Sie können verwenden getString(R.string.some_string_id) in beiden Activity o Fragment .
  • Sie können verwenden Context.getString(R.string.some_string_id) wo Sie keinen direkten Zugang zu getString() Methode. Wie Dialog .

Problem

Cuando Sie haben keine Context Zugang wie eine Methode in Ihrem Util clase.

Nehmen Sie die folgende Methode ohne Kontext an.

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

Jetzt werden Sie passieren Context als Parameter in dieser Methode und verwenden getString().

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

Was ich tue, ist

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}

Was? Es ist sehr einfach, es überall in Ihrer App zu verwenden!

Hier ist also ein Lösung mit dem Sie von überall aus auf Ressourcen zugreifen können, wie Util class .

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static Resources resources;

    @Override
    public void onCreate() {
        super.onCreate();

        resources = getResources();
    }

    public static Resources getAppResources() {
        return resources;
    }

}

Fügen Sie ein Namensfeld zu Ihrem manifest.xml <application Tag.

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

Jetzt sind Sie startklar. Verwenden Sie App.getAppResources().getString(R.string.some_id) überall in der App.

17voto

Muhammad Adil Punkte 437

Ein einfacher Weg, um die ID einer Ressource aus einem String zu erhalten. Hier ist resourceName der Name der Ressource ImageView im drawable-Ordner, der auch in der XML-Datei enthalten ist.

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
    ImageView im = (ImageView) findViewById(resID);
    Context context = im.getContext();
    int id = context.getResources().getIdentifier(resourceName, "drawable",
    context.getPackageName());
    im.setImageResource(id);

15voto

Eren Yilmaz Punkte 1042

Einfacher ist die Verwendung der getString() Funktion innerhalb der Aktivität.

String myString = getString(R.string.mystring);

Referenz: http://developer.Android.com/guide/topics/resources/string-resource.html

Ich denke, dass diese Funktion in einer neueren Android-Version hinzugefügt wurde, wer die Geschichte kennt, kann dies kommentieren.

14voto

Harshit Jain Punkte 658

getResources() funktioniert nur, wenn Sie in Activity o Fragment clase.

  • um überall Zugang zur Ressource Strings zu erhalten,

verwenden:

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

8voto

JCarlosR Punkte 1499

Falls Sie Folgendes verwenden Kotlin können Sie eine Erweiterungsfunktion wie folgt definieren:

fun Context.getStringResourceByName(stringName: String): String? {
    val resId = resources.getIdentifier(stringName, "string", packageName)
    return getString(resId)
}

Und dann verwenden Sie sie einfach. In einer Puzzles-App setze ich zum Beispiel den Titel der Aktivität entsprechend dem Namen der Bilddatei:

val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)

In diesem Beispiel lese ich String-Ressourcen auf der Grundlage von dynamischen Namen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X