在我的setSingleChoiceItems alertdialog中使用sharedPreferences加载数据

时间:2013-06-04 15:13:26

标签: android radio-button sharedpreferences android-alertdialog

我正在保存用户在setSingleChoiceItems alertDialog中选择的语言。我希望当应用程序启动时,所有内容都显示在正确的语言中,并且当用户想要选择一种新语言时,当他按下listView以获取alertdialog时,他会看到已经选择的语言选择了正确的无线电按钮。但我似乎无法加载数据。在onCreate中我正在调用我的函数LoadPrefs();但是这似乎没有成功。所以我想我在这里做错了什么?

是否也可以在我的开始活动中加载数据,因为我正在保存语言首选项,它应该在应用程序打开时直接更改,而不是在用户到达SettingsActivity

时更改
public class SettingsActivity extends Activity {        

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings);
        LoadPrefs();
        registerClickCallBack();
        ListView listView = (ListView) findViewById(R.id.settingsList);
        String[] values = new String[] { "Language", "Facebook login", "About" };

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);
        listView.setAdapter(adapter);
    }

    private void LoadPrefs(){
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        String langValue = sp.getString("lang", "en");      

    }

    private void savePrefs(String lang, String value){
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        Editor edit = sp.edit();
        edit.putString(lang, value);
        edit.commit();
    }

    private String lang(String lang){
        String language = lang;
        Locale local;
        Configuration config;

        local = new Locale(language); 
        Locale.setDefault(local);
        config = new Configuration();
        config.locale = local;
        getBaseContext().getResources().updateConfiguration(config, 
        getBaseContext().getResources().getDisplayMetrics());

        savePrefs("lang", lang);

        return lang;    
    }


    private void registerClickCallBack() {
        ListView list = (ListView) findViewById(R.id.settingsList);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View viewClicked,
                    int position, long id) {

                if (position == 0) {                    
                    String langEN = getResources().getString(R.string.langEN);
                    String langFR = getResources().getString(R.string.langFR);
                    String langNL = getResources().getString(R.string.langNL);
                    String langTitle = getResources().getString(R.string.langTitle);

                    final CharSequence[] items = {langEN, langFR, langNL};

                    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this);
                    builder.setTitle(langTitle);

                    builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int item) {

                            switch (item) {
                                case 0:
                                    lang("en");
                                    break;

                                case 1:
                                    lang("fr");
                                    break;

                                case 2:
                                    lang("nl");
                                    break;

                            }
                            dialog.dismiss();


                        }
                    });

                    final AlertDialog levelDialog = builder.create();
                    levelDialog.show();

                }
            }
        });
    }   
}

1 个答案:

答案 0 :(得分:0)

两件事:

首先,您必须在设置内容视图之前应用自定义配置。

这是在您的代码的上下文中,在LoadPrefs()之前调用setContentView()并在其末尾添加lang(langValue);

其次,您必须在用户选择新区域设置后重新启动应用。你可以用这样的东西来实现这个目标(可能还有其他/更好的方法):

private void restartSelf() {
    AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 1000/*restart after one second*/,
    PendingIntent.getActivity(this, 0, getIntent(), PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT));
    finish();
}

注意:我发现您使用的是英语,荷兰语和德语,所有这些语言都由操作系统本机支持。如果您使用提供的平台localization,则会更好。