在运行时无法实现更改配置(语言环境)(运行活动)

时间:2015-05-26 13:04:08

标签: java android

我想在我的应用程序(运行时)上更改区域设置。到目前为止它工作正常。唯一剩下的就是刷新当前的活动。

文档说更新语言环境配置应该重新启动正在运行的活动(与屏幕方向相同的行为),但它会在我的情况下重新启动它。 (我没有使用paginationConfig.previousText = 'PREVIOUS' | translate; 来阻止此行为。)

以下是关键部分:

我有我的活动:

paginationConfig.previousText = 'PREVIOUS' | $translateProvider;

我绑定点击的适配器(在getChildView函数内):

android:configChanges="locale"

我的I18N类中的setLang方法: 公共课I18N {

public class SettingsActivity extends Activity {

    ExpandableListAdapter listAdapter;
    //....
}

}

我试过这个。它有点工作,但我不喜欢这种手动刷新活动的想法。 主要问题是,尽管使用了标志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"); }; }); } ,但历史记录(使用移动设备的后退按钮)无法正常工作(每次单击列表以更改语言仍会创建历史记录):

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());
    }
}

我做错了什么?如何使updateConfiguration重新启动活动或使手动意图不创建历史记录?

2 个答案:

答案 0 :(得分:1)

在更改区域设置以更改活动布局或重新填充片段

之后,您需要再次设置内容视图(),而不是重新启动活动。
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();
}

答案 1 :(得分:0)

我已将android:noHistory="true"添加到AndroidManifest.xml中的设置活动

这样,我可以在更改语言后返回主屏幕。