[Android] ऐप के भीतर लोकेल बदलना



Answers

नींद की अच्छी रात के बाद, मुझे वेब पर उत्तर मिला (निम्न पंक्ति पर एक साधारण Google खोज " getBaseContext().getResources().updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics()); " ), यह रहा :

लिंक टेक्स्ट => यह लिंक भी हो रहा है के screenshots दिखाता है!

घनत्व यहां मुद्दा था , मुझे इसे AndroidManifest.xml में रखना था

<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>

एंड्रॉइड सबसे महत्वपूर्ण है : anyDensity = "true"

प्रत्येक गतिविधि के लिए AndroidManifest.xml में निम्न को जोड़ने के लिए मत भूलना (Android 4.1 और नीचे के लिए):

android:configChanges="locale"

जब आप एंड्रॉइड 4.2 (एपीआई लेवल 17) स्पष्टीकरण के लिए निर्माण करते हैं तो इस संस्करण की आवश्यकता होती है :

android:configChanges="locale|layoutDirection"
Question

मेरे उपयोगकर्ता ऐप के भीतर लोकेल बदल सकते हैं (वे अपने फोन सेटिंग्स को अंग्रेजी में रखना चाहते हैं लेकिन फ्रेंच, डच या किसी अन्य भाषा में मेरे ऐप की सामग्री पढ़ सकते हैं ...)

यह 1.5 / 1.6 में पूरी तरह ठीक क्यों काम कर रहा है लेकिन 2.0 में अब नहीं ???

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
    case 201:
        Locale locale2 = new Locale("fr"); 
        Locale.setDefault(locale2);
        Configuration config2 = new Configuration();
        config2.locale = locale2;
        getBaseContext().getResources().updateConfiguration(
            config2, getBaseContext().getResources().getDisplayMetrics());
        // loading data ...
        refresh();
        // refresh the tabs and their content
        refresh_Tab ();   
     break;
     case 201: etc...

समस्या यह है कि जब उपयोगकर्ता ऊपर कोड की रेखाओं के माध्यम से जा रहा है, तो मेन्यू "हर समय" कम हो जाता है ...

यह वह मेनू है जो संकुचित हो जाता है:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, 100, 1, "REFRESH").setIcon(android.R.drawable.ic_menu_compass);
    SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);
        langMenu.add(1, 201, 0, "Nederlands");
        langMenu.add(1, 202, 0, "Français");
    menu.add(0, 250, 4, R.string.OptionMenu2).setIcon(android.R.drawable.ic_menu_send);
    menu.add(0, 300, 5, R.string.OptionMenu3).setIcon(android.R.drawable.ic_menu_preferences);
    menu.add(0, 350, 3, R.string.OptionMenu4).setIcon(android.R.drawable.ic_menu_more);
    menu.add(0, 400, 6, "Exit").setIcon(android.R.drawable.ic_menu_delete);

    return super.onCreateOptionsMenu(menu);
}

इस काम को फिर से बनाने के लिए मुझे एपीआई लेवल 5 में क्या करना चाहिए?

अगर आप यह परीक्षण करना चाहते हैं तो पूर्ण कोड यहां है:

import java.util.Locale;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;

public class Main extends Activity {
    /** Called when the activity is first created. */


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);
            langMenu.add(1, 201, 0, "Nederlands");
            langMenu.add(1, 202, 0, "Français");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){

        case 201:

            Locale locale = new Locale("nl"); 
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
            Toast.makeText(this, "Locale in Nederlands !", Toast.LENGTH_LONG).show();
            break;

        case 202:

            Locale locale2 = new Locale("fr"); 
            Locale.setDefault(locale2);
            Configuration config2 = new Configuration();
            config2.locale = locale2;
            getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

            Toast.makeText(this, "Locale en Français !", Toast.LENGTH_LONG).show();
            break;  

        }
        return super.onOptionsItemSelected(item);
    }
}

और यहां मैनिफ़ेस्ट है:

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.cousinHub.ChangeLocale"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".Main"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-sdk android:minSdkVersion="3" /> 
    </manifest>

यह है जो मैंने पाया :

<uses-sdk android:minSdkVersion="5" />

=> यह ठीक काम करता है ...

<uses-sdk android:minSdkVersion="3" />

=> जब भी आप लोकेल बदलते हैं तो मेनू घटता है !!!

क्योंकि मैं 1.5 पर उपयोगकर्ताओं के लिए अपना एप्लिकेशन सुलभ रखना चाहता हूं, मुझे क्या करना चाहिए ??




यह एंड्री के जवाब पर मेरी टिप्पणी के लिए है लेकिन मैं टिप्पणियों में कोड शामिल नहीं कर सकता।

क्या आपको प्राथमिक गतिविधि से प्राथमिक गतिविधि कहा जा रहा है? आप इसे फिर से शुरू कर सकते हैं ...

@Override
protected void onResume() {
    if (!(PreferenceManager.getDefaultSharedPreferences(
            getApplicationContext()).getString("listLanguage", "en")
            .equals(langPreference))) {
        refresh();
    }
    super.onResume();
}

private void refresh() {
    finish();
    Intent myIntent = new Intent(Main.this, Main.class);
    startActivity(myIntent);
}



यदि आप लोकेल को तुरंत बदलने के लिए मेनू विकल्पों पर प्रभाव डालना चाहते हैं। आपको ऐसा करना होगा।

//onCreate method calls only once when menu is called first time.
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    //1.Here you can add your  locale settings . 
    //2.Your menu declaration.
}
//This method is called when your menu is opend to again....
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    menu.clear();
    onCreateOptionsMenu(menu);
    return super.onMenuOpened(featureId, menu);
}



Links