android - ऐप के भीतर लोकेल बदलना





menu locale (6)


मैं एंड्रॉइड का उपयोग नहीं कर सका: anyDensity = "true" क्योंकि मेरे खेल में ऑब्जेक्ट्स पूरी तरह अलग स्थित होंगे ... ऐसा लगता है कि यह चाल भी करता है:

// creating locale
Locale locale2 = new Locale(loc); 
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;

// updating locale
mContext.getResources().updateConfiguration(config2, null);

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

यह 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 पर उपयोगकर्ताओं के लिए अपना एप्लिकेशन सुलभ रखना चाहता हूं, मुझे क्या करना चाहिए ??




मूल प्रश्न के माध्यम से लोकल के बारे में बिल्कुल नहीं है अन्य सभी लोकेल संबंधित प्रश्न इस संदर्भ में हैं। यही कारण है कि मैं इस मुद्दे को स्पष्ट करना चाहता था। मैंने इस सवाल का इस्तेमाल अपने स्वयं के लोकेल स्विचिंग कोड के लिए शुरुआती बिंदु के रूप में किया और पाया कि विधि बिल्कुल सही नहीं है। यह काम करता है, लेकिन केवल तब तक जब तक कोई कॉन्फ़िगरेशन परिवर्तन (जैसे स्क्रीन रोटेशन) और केवल उस विशेष गतिविधि में। थोड़ी देर के लिए एक कोड के साथ खेलना मैं निम्नलिखित दृष्टिकोण के साथ समाप्त हो गया है:

मैंने android.app.Aplication बढ़ाया है और निम्न कोड जोड़ा है:

public class MyApplication extends Application
{
    private Locale locale = null;

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        if (locale != null)
        {
            newConfig.locale = locale;
            Locale.setDefault(locale);
            getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
        }
    }

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

        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

        Configuration config = getBaseContext().getResources().getConfiguration();

        String lang = settings.getString(getString(R.string.pref_locale), "");
        if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang))
        {
            locale = new Locale(lang);
            Locale.setDefault(locale);
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
        }
    }
}

यह कोड सुनिश्चित करता है कि प्रत्येक गतिविधि में कस्टम लोकेल सेट होगा और इसे रोटेशन और अन्य ईवेंट पर रीसेट नहीं किया जाएगा।

मैंने वरीयता परिवर्तन को तत्काल लागू करने की कोशिश करने में बहुत समय व्यतीत किया है लेकिन सफल नहीं हुआ: भाषा पुन: प्रारंभ करने पर भाषा सही ढंग से बदल दी गई है, लेकिन पूर्ण प्रारूप पुनरारंभ होने तक संख्या प्रारूप और अन्य लोकेल गुण लागू नहीं किए गए थे।

AndroidManifest.xml परिवर्तन

android:configChanges="layoutDirection|locale" जोड़ने के लिए मत भूलना android:configChanges="layoutDirection|locale" AndroidManifest में प्रत्येक गतिविधि के लिए android:configChanges="layoutDirection|locale" साथ-साथ android:name=".MyApplication" <application> element पर।




एंड्रॉइड एम में शीर्ष समाधान काम नहीं करेगा। मैंने आपके आवेदन वर्ग और सभी क्रियाकलापों से आपको कॉल करने के लिए एक सहायक वर्ग लिखा है (मैं बेसएक्टिविटी बनाने का सुझाव दूंगा और फिर सभी गतिविधियों को इसके उत्तराधिकारी बना दूंगा।

नोट : यह ठीक से आरटीएल लेआउट दिशा का भी समर्थन करेगा।

सहायक वर्ग:

public class LocaleUtils {

    private static Locale sLocale;

    public static void setLocale(Locale locale) {
        sLocale = locale;
        if(sLocale != null) {
            Locale.setDefault(sLocale);
        }
    }

    public static void updateConfig(ContextThemeWrapper wrapper) {
        if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Configuration configuration = new Configuration();
            configuration.setLocale(sLocale);
            wrapper.applyOverrideConfiguration(configuration);
        }
    }

    public static void updateConfig(Application app, Configuration configuration) {
        if (sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            //Wrapping the configuration to avoid Activity endless loop
            Configuration config = new Configuration(configuration);
            // We must use the now-deprecated config.locale and res.updateConfiguration here,
            // because the replacements aren't available till API level 24 and 17 respectively.
            config.locale = sLocale;
            Resources res = app.getBaseContext().getResources();
            res.updateConfiguration(config, res.getDisplayMetrics());
        }
    }
}

आवेदन:

public class App extends Application {
    public void onCreate(){
        super.onCreate();

        LocaleUtils.setLocale(new Locale("iw"));
        LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LocaleUtils.updateConfig(this, newConfig);
    }
}

BaseActivity:

public class BaseActivity extends Activity {
    public BaseActivity() {
        LocaleUtils.updateConfig(this);
    }
}



नींद की अच्छी रात के बाद, मुझे वेब पर उत्तर मिला (निम्न पंक्ति पर एक साधारण 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"



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

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

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



आप सिस्टस्टेट () को अपनी गतिविधि के ऑनपोस्टक्रेट से कॉल कर सकते हैं ताकि इंडेक्टर को सिग्नल सिंक्रनाइज़ करने के लिए रेस्त्रांइनस्टेंसस्टेट के बाद जुड़े हुए ड्रॉवरलेआउट की स्थिति के साथ सिंक्रनाइज़ किया जा सके।

@Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

इसके अलावा ActionBarDrawerToggle को सीधे DrawerLayout.DrawerListener के रूप में उपयोग किया जा सकता है, या यदि आप पहले से ही अपना स्वयं का श्रोता प्रदान कर रहे हैं, तो अपने प्रत्येक श्रोता विधियों से कॉल करें।

private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
  .
  .
  .
  .
mDrawerLayout.setDrawerListener(mDrawerToggle);

    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });




android menu locale