2015-05-26 3 views
1

Я бы хотел изменить локаль в своем приложении (время выполнения). Пока все работает нормально. Остается только обновить текущую активность.Невозможно выполнить изменение конфигурации (локали) во время выполнения (текущая активность)

В документации говорится, что при обновлении конфигурации локали необходимо перезапустить текущую активность (то же поведение, что и ориентация экрана), но она перезапустит ее в моем случае. (Я не использовал 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 перезапустить действие или сделать ручное намерение не создавать историю?

ответ

1

Вместо возобновления деятельности, вы хотите setContentView() еще раз после того, как вы измените региональные настройки, чтобы изменить расположение активности или reinflate фрагмента

convertView.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         I18N.setLang(context, "fr"); 
         //setContentView(R.layout.act_layout); // for activity 
         convertView = inflater.inflate(R.layout.list_item, null) 
        }; 
       }); 

редактировать

Ваш convertView будет окончательным поэтому вы можете обновить его с помощью метода

protected View refresh() 
{ 
    //inflate 
    View convertView = inflater.inflate(R.layout.list_item, null); 
    //setup ui controls 
    convertView.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View view) { 
        I18N.setLang(context, "fr"); 
        refresh(); 
        }; 
      }); 
    return convertView ; 
} 

public View getChildView(final int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, ViewGroup parent) 
{ 
    return refresh(); 
} 
+0

Это может быть хорошим руководством, однако у меня есть ошибка: «доступ изнутри внутреннего класса должен быть объявлен окончательным», и я не могу установить окончательный просмотр convertView в объявлении функции, поскольку он сказал: «невозможно присвоить значение конечной переменной " –

+0

У меня установлен view = inflater.inflate (R.layout.list_item, null), но это ничего не меняет. –

+0

Просьба видеть мое редактирование –

0

Я добавил android:noHistory="true" к моим настройкам в AndroidManifest.xml

Таким образом, я могу вернуться на главный экран после смены языка.

Смежные вопросы