【问题标题】:Action Bar does not Recreate on Activity Recreate AndroidAction Bar 不会在 Activity Recreate Android 上重新创建
【发布时间】:2015-05-30 10:51:52
【问题描述】:

我正在根据用户输入更改我的应用程序的语言。 在此之后,我必须重新创建活动才能使更改可见。到目前为止,我已经尝试了两种方法:

  1. 第一种方法:

              Intent refresh = getIntent();
              finish();
              startActivity(refresh);
    

但问题是,尽管活动加载了新的语言字符串,但操作栏标题仍保留为以前的语言。如果我关闭应用程序并再次加载屏幕,一切都很好。 所以我想我可能做错了什么并将代码更改为:

  1. 第二种方法:

    Intent refresh = new Intent(this, FirstActivity.Class);
    refresh.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(refresh);
    finish();
    

    Reference

这会导致应用程序崩溃。任何见解都会非常有帮助。

注意: 我正在使用 app.support.v7.app.ActionBarActivity

问题截图:

编辑:

我也试过了:

 Intent refresh =getIntent();
         finish(); 
         this.supportInvalidateOptionsMenu();
          startActivity(refresh);

问题依然存在。

编辑 2: 使用:

Intent refresh =getIntent();
         if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
               supportInvalidateOptionsMenu();

            else
               invalidateOptionsMenu();

         //this.supportInvalidateOptionsMenu();
         //finish(); 

          startActivity(refresh);
          finish();

问题依然存在。

【问题讨论】:

  • 请在startActivity()之后致电finish()

标签: android android-activity android-actionbar locale


【解决方案1】:

你可以通过调用invalidateOptionsMenu();让android在它自动创建之前重新创建actionbar

示例:

 // whatever you want to do before you want to recreate action bar

activity.invalidateOptionsMenu();

** 编辑 **

在 API supportInvalidateOptionsMenu() 方法

完整的解决方案是这样的:

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
   supportInvalidateOptionsMenu();

else
   invalidateOptionsMenu();

【讨论】:

  • 我的最小 sdk 版本是 7。所以不能使用 invalidateOptionsMenu :( 这是在 API 11 中引入的
  • 在调用finish()之前调用this.supportInvalidateOptionsMenu();,请使用条件语句,如我更新的答案
  • @Syed Osama Maruf,你能显示你所面临的错误堆栈跟踪吗?
【解决方案2】:

onCreate 方法中重新创建 Activity 后尝试设置操作栏标题,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    resetTitle();
}
...
private void resetTitle() {
    try {
        int label = getPackageManager().getActivityInfo(getComponentName(), GET_META_DATA).labelRes;
        if (label != 0) {
            if (getSupportActionBar() != null) {
                getSupportActionBar().setTitle(getString(label));
            } else {
                setTitle(label);
            }
        }
    } catch (PackageManager.NameNotFoundException e) {
        Log.e(TAG, "Reset title problem", e);
    }
}

顺便说一句,您还可以使用recreate 方法重新创建活动。它是在 API 级别 11 中添加的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多