【问题标题】:Cannot achieve to change Configuration (locale) at runtime (running activity)无法实现在运行时更改配置(区域设置)(运行活动)
【发布时间】:2015-05-26 13:04:07
【问题描述】:

我想更改我的应用程序(运行时)的语言环境。到目前为止它运行良好。唯一剩下的就是刷新当前活动。

文档说更新语言环境配置应该重新启动正在运行的活动(与屏幕方向相同的行为),但在我的情况下它确实重新启动它。 (我没有使用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");

                    };
                });
}

我的 I18N 类中的 setLang 方法: 公共类 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 重新启动活动或使手动意图不创建历史记录?

【问题讨论】:

    标签: java android


    【解决方案1】:

    您不想重新启动活动,而是希望在更改语言环境以更改活动布局或重新填充片段后再次 setContentView()

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

    【讨论】:

    • 这可能是一个很好的线索,但是我有错误:“从内部类中访问需要声明为 final”,我无法在函数声明中设置 final View convertView,因为它说:“无法分配最终变量的值"
    • 我设置了 view = inflater.inflate(R.layout.list_item, null) 但它没有改变任何东西。
    • 谢谢。我的 listView 中有许多类型的单元格。这意味着我必须为每个视图膨胀(它们使用不同的布局)?
    • 是的,您需要在更改语言环境后对每个不同的布局进行扩充
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-19
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多