2016-05-28 4 views
2

Ich wollte Lokalisierung in meiner App dynamisch anwenden, so ist es möglich, Strings in Java-Datei zu definieren und diese Strings in unsere Layout-XML-Datei zu holen, dh wir @ string/anystringname ersetzen dies durch die in java-Datei definierten Strings zu unserem Layout Datei @SOMESTRING definiert in Java-Datei ????Ist es möglich, string.xml-Datei zur Laufzeit in Android zu aktualisieren?

+0

'Ist es möglich, ...' ** NO **. Sie können die Ressourcendateien zur Laufzeit nicht ändern. –

+0

Aber es muss einen Weg geben, programmatisch zu tun und die IDs zu bekommen ?? – Shailee

Antwort

3

Grundsätzlich

Sie können Ressourcendatei nicht dynamisch bearbeiten. Sie müssen diese Funktionalität selbst implementieren.

Hier ein Beispiel:

english.json

{ 
    "hello": "Hello" 
} 

french.json

{ 
    "hello": "Bonjour" 
} 
public class StringManager { 
    private static StringManager sInstance = null; 
    private static String sDefaultLanguageCode = "en"; 

    private Map<String, JSONObject> mLanguageMap = new ArrayMap<>(); 

    private StringManager() { 
    } 

    public static StringManager getInstance() { 
     if (sInstance == null) { 
      synchronized (StringManager.class) { 
       if (sInstance == null) 
        sInstance = new StringManager(); 
      } 
     } 
     return sInstance; 
    } 

    public static void setDefaultLanguageCode(String languageCode) { 
     sDefaultLanguageCode = languageCode; 
    } 

    public void addLanguage(String languageCode, JSONObject json) { 
     mLanguageMap.put(languageCode, json); 
    } 

    public String getString(String key) { 
     return mLanguageMap.get(mDefaultLanguageCode).getString(key); 
    } 

    public String getString(String languageCode, String key) { 
     return mLanguageMap.get(languageCode).getString(key); 
    } 
} 

public class SomeActivity extends Activity { 
    ... 
    public void initStringResources() { 
     // assume englishJsonObject is created from english.json 
     StringManager.getInstance().addLanguage("en", englishJsonObject); 
     StringManager.getInstance().addLanguage("fr", frenchJsonObject); 

     StringManager.setDefaultLanguageCode("fr"); 
    } 

    public void useSomeString() { 
     String helloString = StringManager.getInstance().getString("hello"); 
     // helloString will be "Bonjour" 

     // and you can get specific language string 
     String englishHelloString = StringManager.getInstance().getString("en", "hello"); 
    } 

    // this may be called from Button or other UI component 
    public void onLanguageChanged(String languageCode) { 
     StringManager.setDefaultLanguageCode(languageCode); 
     // and update UI components that display localized strings 
    } 
} 
+0

hii..tried ur Lösung, aber es funktioniert nicht .. kann ich Bewahren Sie die Datei im Asset-Ordner auf, und nachdem Sie diese Datei gelesen haben, kann diese Datei im Layout verwendet werden. – Shailee

+0

Wie bereits erwähnt, können Sie XML-Dateien zur Laufzeit nicht ändern. Wenn Sie meine Lösung wie '' versucht, wird dies natürlich nicht funktionieren. Stattdessen können Sie textView programmatisch festlegen. Wenn Sie eine TextView in xml-Datei wie folgt deklarieren '' Sie können meine Lösung wie folgt verwenden; Textansicht textView = (TextView) findViewById (R.id.my_textview); textView.setText (StringManager.getInstance(). GetString ("Hallo")); – nexus5x

+0

okay, habe deine Lösung ... ich muss es programmatisch tun nur eine gemeinsame Funktion für alle und Callin String erstellen – Shailee

-2
<TextView 
android:id="@+id/tv" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/tv" 
/> 

<string name="tv">old text</string>//old text 

final TextView textView = (TextView) findViewById(R.id.rate); 
textView.setText("new text");//new text 
0

Dies ist nicht möglich. Es ist jedoch möglich, die Sprache Ihrer App zur Laufzeit zu ändern. Dadurch können Sie zwischen den strings.xml für die verschiedenen Sprachen wechseln. Eine Bibliothek, die ich dafür verwendete, ist die Android localization library Alle Ihre Aktivitäten müssen die LocalizationActivity erweitern, die die AppCompatActivity erweitert. Sie müssen nur anrufen setLanguage ("en"); Um die Sprache Ihrer Anwendung zu ändern, verwenden Sie eine andere strings.xml

In this thread können Sie weitere mögliche Lösungen lesen.

+0

yaa Throug Werte Ordner für verschiedene Sprachen ist es möglich, alle Zeichenfolgen zu holen, aber wie man es dynamisch tut, ohne Eingabe aller verschiedenen Sprachzeichenfolgen ?? Wenn ich json für alle Zeichenketten erzeuge, die in db speichern, indem ich Schlüsselwerte durchführe und diese Zeichenkette in meiner Layout-Datei – Shailee

+0

@Shailee verwende, funktioniert diese Lösung nur, wenn Sie die Lokalisierungen in strings.xml einschließen. Die Bibliothek ermöglicht Ihnen, Ihre Sprache zu wechseln. Die Zeichenfolgen.xml für eine andere Sprache werden jetzt verwendet. Dies ermöglicht eine dynamische Lokalisierung. Wenn Sie jedoch die lokalisierten Zeichenfolgen aus einer Datenbank abrufen möchten. Ihre beste Option besteht wahrscheinlich darin, TextView abzuleiten und ein benutzerdefiniertes Attribut hinzuzufügen. https://developer.android.com/training/custom-views/create-view.html. In Ihrer Textansicht können Sie die Logik zum Lesen der richtigen Zeichenfolge implementieren. – Rockney

+0

ok, ist es also möglich, Sprachen dynamisch zu ändern, wenn Sie durch diese Lokalisierungsbibliothek klicken, ohne eine neue Zeichenkette für verschiedene Sprachen zu erstellen? – Shailee

Verwandte Themen