Я бы хотел изменить локаль в своем приложении (время выполнения). Пока все работает нормально. Остается только обновить текущую активность.Невозможно выполнить изменение конфигурации (локали) во время выполнения (текущая активность)
В документации говорится, что при обновлении конфигурации локали необходимо перезапустить текущую активность (то же поведение, что и ориентация экрана), но она перезапустит ее в моем случае. (Я не использовал android:configChanges="locale"
, чтобы предотвратить это поведение).
Вот основные части:
У меня есть активность:
public class SettingsActivity extends Activity {
ExpandableListAdapter listAdapter;
//....
}
закрепительной где я связать щелчок (внутри функции getChildView):
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
//...
convertView = inflater.inflate(R.layout.list_item, null);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
I18N.setLang(context, "fr");
};
});
}
И в setLang метод внутри моего класса I18N: общественный класс I18N {
public static void setLang(final Context context, String langCode)
{
if (langCode.equals(""))
return;
try {
final Locale newLocale;
final String[] languageRegion = langCode.split("\\-(r)?");
I18N.saveLocale(context, langCode);
newLocale = languageRegion.length > 1 ? new Locale(languageRegion[0], languageRegion[1]) : new Locale(languageRegion[0]) ;
current = newLocale;
Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale(languageRegion[0]);
res.updateConfiguration(conf, dm);
}
catch (Exception e) {
Log.e("exception", e.getMessage() + e.getClass());
}
}
Я пробовал это. Это вроде работает, но мне не нравится эта идея обновления активности вручную. Основная проблема заключается в том, что, несмотря на использование флага FLAG_ACTIVITY_NO_HISTORY
, история (с помощью задней кнопки мобильного устройства) не работает должным образом (каждый клик в списке, чтобы изменить язык по-прежнему создает историю):
Intent refresh = new Intent(context, context.getClass());
refresh.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(refresh);
Что я делаю неправильно? Как я могу либо сделать updateConfiguration перезапустить действие или сделать ручное намерение не создавать историю?
Это может быть хорошим руководством, однако у меня есть ошибка: «доступ изнутри внутреннего класса должен быть объявлен окончательным», и я не могу установить окончательный просмотр convertView в объявлении функции, поскольку он сказал: «невозможно присвоить значение конечной переменной " –
У меня установлен view = inflater.inflate (R.layout.list_item, null), но это ничего не меняет. –
Просьба видеть мое редактирование –