gpt4 book ai didi

android - 在 SettingsActivity 中更改应用程序内的语言环境(语言)

转载 作者:数据小太阳 更新时间:2023-10-29 02:45:03 28 4
gpt4 key购买 nike

我希望用户能够更改应用程序语言(字符串位于 strings-de/strings.xml 或 strings-zh/strings.xml 等文件夹中)。当我将电话设置更改为中文或其他设置时它工作正常,但我想做的是以下内容:我有一个带有几个 fragment 的 MainActivity,在我的操作栏中有一个设置图标,当用户单击它时,会打开一个 settingsActivity,并且我有一个菜单项,用户可以在其中选择他喜欢的语言。当用户单击它时,应用程序应重新加载并使用所选语言的字符串。我怎样才能做到这一点?代码属于哪个 Activity ?提前谢谢你。

这里是我的设置 Activity :

public class SettingsActivity extends PreferenceActivity {
private static final boolean ALWAYS_SIMPLE_PREFS = false;

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

setupSimplePreferencesScreen();
}

@SuppressWarnings("deprecation")
private void setupSimplePreferencesScreen() {
if (!isSimplePreferences(this)) {
return;
}

// In the simplified UI, fragments are not used at all and we instead
// use the older PreferenceActivity APIs.

// Add 'general' preferences.
addPreferencesFromResource(R.xml.pref_general);

// Add 'Cash-Game Ticker' preferences, and a corresponding header.
PreferenceCategory fakeHeader = new PreferenceCategory(this);
fakeHeader.setTitle(R.string.pref_header_cg_notifications);
getPreferenceScreen().addPreference(fakeHeader);
addPreferencesFromResource(R.xml.pref_cg_notification);

// Add 'Tournament Ticker' preferences, and a corresponding header.
PreferenceCategory fakeHeader2 = new PreferenceCategory(this);
fakeHeader2.setTitle(R.string.pref_header_tm_notifications);
getPreferenceScreen().addPreference(fakeHeader2);
addPreferencesFromResource(R.xml.pref_tm_notification);

// Bind the summaries of EditText/List/Dialog/Ringtone preferences to
// their values. When their values change, their summaries are updated
// to reflect the new value, per the Android Design guidelines.
bindPreferenceSummaryToValue(findPreference("location_list"));
bindPreferenceSummaryToValue(findPreference("language_list"));
bindPreferenceSummaryToValue(findPreference("notifications_new_cg_ringtone"));
bindPreferenceSummaryToValue(findPreference("notifications_new_tm_ringtone"));
}

/** {@inheritDoc} */
@Override
public boolean onIsMultiPane() {
return isXLargeTablet(this) && !isSimplePreferences(this);
}

private static boolean isXLargeTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}

private static boolean isSimplePreferences(Context context) {
return ALWAYS_SIMPLE_PREFS
|| Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
|| !isXLargeTablet(context);
}

/** {@inheritDoc} */
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List<Header> target) {
if (!isSimplePreferences(this)) {
loadHeadersFromResource(R.xml.pref_headers, target);
}
}

/**
* A preference value change listener that updates the preference's summary
* to reflect its new value.
*/
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();

if (preference instanceof ListPreference) {
// For list preferences, look up the correct display value in
// the preference's 'entries' list.
ListPreference listPreference = (ListPreference) preference;
int index = listPreference.findIndexOfValue(stringValue);

// Set the summary to reflect the new value.
preference
.setSummary(index >= 0 ? listPreference.getEntries()[index]
: null);

} else if (preference instanceof RingtonePreference) {
// For ringtone preferences, look up the correct display value
// using RingtoneManager.
if (TextUtils.isEmpty(stringValue)) {
// Empty values correspond to 'silent' (no ringtone).
preference.setSummary(R.string.pref_ringtone_silent);

} else {
Ringtone ringtone = RingtoneManager.getRingtone(
preference.getContext(), Uri.parse(stringValue));

if (ringtone == null) {
// Clear the summary if there was a lookup error.
preference.setSummary(null);
} else {
// Set the summary to reflect the new ringtone display
// name.
String name = ringtone
.getTitle(preference.getContext());
preference.setSummary(name);
}
}

} else {
// For all other preferences, set the summary to the value's
// simple string representation.
preference.setSummary(stringValue);
}
return true;
}
};

private static void bindPreferenceSummaryToValue(Preference preference) {
// Set the listener to watch for value changes.
preference
.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

// Trigger the listener immediately with the preference's
// current value.
sBindPreferenceSummaryToValueListener.onPreferenceChange(
preference,
PreferenceManager.getDefaultSharedPreferences(
preference.getContext()).getString(preference.getKey(),
""));
}

/**
* This fragment shows general preferences only. It is used when the
* activity is showing a two-pane settings UI.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);

// Bind the summaries of EditText/List/Dialog/Ringtone preferences
// to their values. When their values change, their summaries are
// updated to reflect the new value, per the Android Design
// guidelines.
bindPreferenceSummaryToValue(findPreference("example_text"));
bindPreferenceSummaryToValue(findPreference("example_list"));
}
}

/**
* This fragment shows notification preferences only. It is used when the
* activity is showing a two-pane settings UI.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class NotificationPreferenceFragment extends
PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_cg_notification);

// Bind the summaries of EditText/List/Dialog/Ringtone preferences
// to their values. When their values change, their summaries are
// updated to reflect the new value, per the Android Design
// guidelines.
bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
}
}

/**
* This fragment shows data and sync preferences only. It is used when the
* activity is showing a two-pane settings UI.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class DataSyncPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_tm_notification);

// Bind the summaries of EditText/List/Dialog/Ringtone preferences
// to their values. When their values change, their summaries are
// updated to reflect the new value, per the Android Design
// guidelines.
bindPreferenceSummaryToValue(findPreference("sync_frequency"));
}
}
}

这里是用户可以选择语言的 xml 部分:

<ListPreference
android:defaultValue="en"
android:entries="@array/pref_language_select"
android:entryValues="@array/pref_language_values"
android:key="language_list"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_language" />

这里是语言选择列表中的数组:

<string-array name="pref_language_select">
<item>Deutsch</item>
<item>English</item>
<item>中文</item>
<item>Espanol</item>
<item>Magyar</item>
<item>Srpski</item>
<item>Nederlands</item>
</string-array>
<string-array name="pref_language_values">
<item>de</item>
<item>en</item>
<item>zh</item>
<item>es</item>
<item>mg</item>
<item>sr</item>
<item>nl</item>
</string-array>

我希望有人能帮助我,提前谢谢你!

最佳答案

有趣的..试试这个:

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

String lang = "fr"//get your language here as you see fit
if ( ! config.locale.getLanguage().equals(lang))
{
locale = new Locale(lang);
Locale.setDefault(locale);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}

如果这对您有用,那么我担心 onconfig 的变化。我假设在处理配置更改时,您必须再次执行此操作。

关于android - 在 SettingsActivity 中更改应用程序内的语言环境(语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775125/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com