2

私のプロジェクトでは、多言語オプションを実装する必要があります。このために、次のコードを書きました。

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

参考画像: ここに画像の説明を入力

ここでは、選択した言語でボタンのテキストを更新したいと考えています。このために、私は次の方法を試します。

私の活動で。

私のフラグメントコードは次のとおりです。

public class LanguageFragment extends ListFragment {

String[] language_id = new String[] { "", "tn", "ja" };
ListView lv;
SharedPreferences settings;
SharedPreferences.Editor editor;
onLanguageSelectedListener mListener;
int pos;

public interface onLanguageSelectedListener {
    void setonLanguage();
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    lv = getListView();
    System.out.println("getlistview");

    String english = getActivity().getString(R.string.english) + "";
    String tamil = getActivity().getText(R.string.tamil) + "";
    String japanse = getActivity().getText(R.string.japanese) + "";
    String[] language_list = new String[] { english, tamil, japanse };

    settings = getActivity().getSharedPreferences("LANGUAGE_TYPE", 0);
    ListAdapter adapter = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, language_list) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (convertView == null) {
                LayoutInflater li = (LayoutInflater) getActivity()
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = li.inflate(android.R.layout.simple_list_item_1, null);
            }
            if (lv.isItemChecked(position)) {
                // v.setActivated(true);
                editor = settings.edit();
                editor.putString("Position", lv.getCheckedItemPosition() + "");
                editor.putString("Language",
                        language_id[lv.getCheckedItemPosition()].toString());
                editor.commit();
                mListener = (onLanguageSelectedListener) getActivity();
                mListener.setonLanguage();
                v.setBackgroundResource(R.drawable.blue_top1);
            } else {
                v.setBackgroundResource(0);
            }
            return super.getView(position, v, parent);
        }
    };
    String s = settings.getString("Position", 0 + "");
    pos = Integer.parseInt(s);
    setListAdapter(adapter);
    lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    lv.setItemChecked(pos, true);
    lv.setSelector(R.drawable.blue_top1);
}

}

そして私の活動は:

public class SettingsActivity extends Activity implements
    OnItemSelectedListener, onLanguageSelectedListener {

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

    SharedPreferences settings = getSharedPreferences("LANGUAGE_TYPE", 0);
    String Language = settings.getString("Language", "");

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

    setContentView(R.layout.settings_activity);
}

public void onSettingsItemSelected(String link) {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();

    Fragment language;
    if ("language".equals(link)) {
        language = new LanguageFragment();
        transaction.replace(R.id.detailFragment, language);
        transaction.commit();
    }
}

public void setonLanguage() {
    SharedPreferences settings = getSharedPreferences("LANGUAGE_TYPE", 0);
    String Language = settings.getString("Language", "");
    Locale locale = new Locale(Language);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());

    name = getText(R.string.hi) + " " + name;
//      Intent intent = getIntent();
//      overridePendingTransition(0, 0);
//      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
//      finish();
//
//      overridePendingTransition(0, 0);
//      startActivity(intent);
    System.out.println("inside listener : " + Language);
}
}

ただし、これはアクティビティを再起動した後にのみ機能します。リストビューのクリックで更新したい。私はそれが可能であることを知っています。しかし、私はそれを達成する方法がわかりません。

4

2 に答える 2

0

まず、AdroidManifest.xml で、すべてのアクティビティのロケール変更を処理することを宣言します。

<activity android:name="YourActivity" android:configChanges="locale" />

次に、すべてのアクティビティ クラスで onConfigurationChanged() コールバックを処理する必要があります。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Change text for all views
    textView.setText(getString(R.string.text));
    ...
}
于 2013-10-04T08:01:13.473 に答える