0

ユーザーが で選択した言語を保存していますsetSingleChoiceItems alertDialog。アプリの起動時にすべてが正しい言語で表示され、ユーザーが新しい言語を選択したいときに、listView を押してアラート ダイアログが表示され、すでに選択されている言語が表示されるようにしたいと思います。選択されている右のラジオボタン。しかし、データを読み込めないようです。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();

                }
            }
        });
    }   
}
4

1 に答える 1

0

2つのこと:

まず、コンテンツ ビューを設定する前に、カスタム構成を適用する必要があります。

それはコードのコンテキストにあり、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();
}

注: 英語、オランダ語、ドイツ語を使用しているようですが、これらはすべて OS でネイティブにサポートされています。プラットフォーム提供のローカリゼーションを使用する方がよいでしょう。

于 2013-06-04T16:16:39.803 に答える