【问题标题】:How can I save my Language?如何保存我的语言?
【发布时间】:2015-08-30 13:06:05
【问题描述】:

我有一个 Spinner,当我点击例如德语时,应用程序会被翻译成德语。当我重新启动应用程序时,我再次拥有默认语言。 我现在的问题是如何保存在我重新启动应用程序时仍然更改为所选语言的语言?

我的Activity的代码是:

private Typeface ttf;

Spinner spinnerctrl;
Button btn;
Locale myLocale;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dialog_einstellungen);
    //Schrift & OnClickListener
    ttf = Typeface.createFromAsset(getAssets(), "schrift.ttf");
    ((TextView)findViewById(R.id.settings_title)).setTypeface(ttf);
    ((TextView)findViewById(R.id.appinfo)).setTypeface(ttf);
    findViewById(R.id.appinfo).setOnClickListener(this);
    ((TextView)findViewById(R.id.settings_back)).setTypeface(ttf);
    findViewById(R.id.settings_back).setOnClickListener(this);
    //Spinner Language
    spinnerctrl = (Spinner) findViewById(R.id.spinner);
    spinnerctrl.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            if (pos == 1) {
                setLocale("ar");
            } else if (pos == 2) {
                setLocale("en");
            } else if (pos == 3) {
                setLocale("de");
            } else if (pos == 3) {
                setLocale("nv-rUs");
            }
        }
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });
}
//TODO Language translation System
//LanguageTranslation
public void setLocale(String lang) {
    myLocale = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
    Intent refresh = new Intent(this, Settings.class);
    startActivity(refresh);
    finish();
}

@Override
public void onBackPressed() {
}

@Override
public void onClick(View view) {
    if(view.getId()==R.id.appinfo) {
       showAppinfo();
    } else if(view.getId()==R.id.settings_back) {
        finish();
    }
}

private void showAppinfo() {
    final Dialog dialog = new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
    dialog.setContentView(R.layout.dialog_appinfo);
    ((TextView)(dialog.findViewById(R.id.appinfo_herrausgeber))).setTypeface(ttf);
    ((TextView)(dialog.findViewById(R.id.appinfo_name))).setTypeface(ttf);
    ((TextView)(dialog.findViewById(R.id.appinfo_version))).setTypeface(ttf);
    ((TextView)(dialog.findViewById(R.id.appinfo_developer))).setTypeface(ttf);
    ((TextView)(dialog.findViewById(R.id.appinfo_back))).setTypeface(ttf);
    dialog.findViewById(R.id.appinfo_back).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dialog.dismiss();
            return;
        }
    });
    dialog.show();
}

}

【问题讨论】:

  • 您可以保存上次选择的语言我共享的首选项,并在启动您的应用程序时检查上次选择的语言并使用该语言初始化您的应用程序

标签: android android-studio save


【解决方案1】:

好的,它正在工作,但您必须完全重新启动应用程序才能更改语言环境。我相信您将能够弄清楚如何使其立即进行更改; )

public class MainActivity extends AppCompatActivity
{
    SharedPreferences sharedPreferences;

    @Override protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );

        sharedPreferences = PreferenceManager.getDefaultSharedPreferences( getApplicationContext( ) );
        setLocale( sharedPreferences.getString( "user_locale", "en" ) );

        setContentView( R.layout.activity_main );

        Spinner spinner = ( Spinner ) findViewById( R.id.spinner );
        spinner.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener( )
        {
            @Override public void onItemSelected( AdapterView< ? > parent, View view, int position, long id )
            {
                switch( position )
                {
                    case 1:
                        setLocale( "de" );
                        break;

                    case 2:
                        setLocale( "ru" );
                        break;

                    default:
                        setLocale( "en" );
                        break;
                }
            }

            @Override public void onNothingSelected( AdapterView< ? > parent ) { }
        } );
    }

    public void setLocale( String lang )
    {
        Locale myLocale = new Locale( lang );

        if( IsLocaleValid( myLocale ) )
        {
            // Setting default locale to myLocale
            Locale.setDefault( myLocale );

            // Getting required variables
            Resources res = getApplicationContext( ).getResources( );
            Configuration conf = res.getConfiguration( );

            // Setting required info
            conf.locale = myLocale;
            res.updateConfiguration( conf, null );

            SharedPreferences.Editor editor = sharedPreferences.edit( );
            editor.putString( "user_locale", lang ).apply( );
        }

        else
        {
            // Logging so that you know that you have error somewhere ; )
            Log.w( "Locale", "Entered invalid locale: " + lang );
        }
    }

    private boolean IsLocaleValid( Locale locale )
    {
        return Arrays.asList( Locale.getAvailableLocales( ) ).contains( locale );
    }

}

附:对不起,我这么久了,我还有一些其他非常重要的事情要做:/

附言请让我知道它是否有效:P

【讨论】:

  • 感谢您的代码。我不知道如何集成代码。你能帮帮我吗!
  • 没问题!编辑答案,在那里寻找实施; )
  • 代码不起作用!每次我加载它时,应用程序都会崩溃
  • 立即查看! :P
【解决方案2】:
SharedPreferences mylanguage;
SharedPreferences.Editor myeditor;
String lang;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
    setContentView(R.layout.dialog_einstellungen);

   mylanguage=PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
     lang=mylanguage.getString("mylang","en"); //en is default when user no select

                  myeditor=mylanguage.edit();
               if(lang.equals("ar")) {
               setLocale("ar");


                     } else if(lang.equals("en")) {
                      setLocale("en");
                    } else if(lang.equals("de")) {
                      setLocale("de");
                   } else if(lang.equals("nv-rUs")) {
                      setLocale("nv-rUs");
                                             }
                                                    }


    spinnerctrl = (Spinner) findViewById(R.id.spinner);

        spinnerctrl.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                                    if (pos == 1) {
                                        setLocale("ar");
                    myeditor.putString("mylang","ar");
                                myeditor.commit();


                                    } else if (pos == 2) {
                                        setLocale("en");
                    myeditor.putString("mylang","en");
                                myeditor.commit();
                                    } else if (pos == 3) {
                                        setLocale("de");
                    myeditor.putString("mylang","de");
                                myeditor.commit();
                                    } else if (pos == 3) {
                                        setLocale("nv-rUs");
 myeditor.putString("mylang","nv-rUs");
                                myeditor.commit();
                                    }

【讨论】:

    【解决方案3】:
    • 使用 SharedPreferences 并在 SharedPreferences 中设置默认语言环境标志
    • 每次用户从微调器中选择时更新区域设置,并在每次启动应用时从那里检查区域设置。
    • 使用 SharedPreferences 中保存的区域设置更新微调器。

    【讨论】:

      【解决方案4】:

      我很久以前就实现了语言切换功能。它不需要重新启动应用程序来更改语言环境。为了让它发挥作用,您必须记住,在应用任何配置更新时,您必须确保所有活动都能够处理该配置更改。仅仅应用它是不够的。如您所知,Android 处理配置更改的默认方式是销毁您的活动并重新创建它。您的另一个选择是在您的清单中指明您要处理该configChange

      对于第一个选项,您只需致电recreate() 了解您的活动即可。好吧,这几乎就是您需要做的所有事情。 Android 在可能的情况下使父活动保持活动状态(调用了他们的 onStop() 方法,但没有调用他们的 onDestroy())。因此,这些活动也需要使用新配置重新创建。您可能已经对如何实现它有所了解。我会留给你找到最好的方法。如果您需要提示,请查看Application.Activity LifecycleCallbacks

      处理配置更改的默认方式对用户不是很友好。销毁和重新创建活动非常缓慢且笨拙。手动处理区域设置更改会带来最佳的用户体验。但是,在您的情况下,由于您在应用区域设置更改后已经销毁了您的活动,因此如果您使用 recreate 方法,用户体验不会受到太大干扰。

      完成所有操作后,您在应用更改后重新创建了所有活动,但新配置仍然丢失。好吧,这就是发生在我身上的事情。如果您也是这种情况,您需要在onCreate() 和调用super.onCreate() 之前再次应用配置更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 2019-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多