使用 ApplicationContext 实例化工具栏

Instanciating a Toolbar with an ApplicationContext

我可以创建一个 Toolbar 以编程方式传递给它一个 ApplicationContext:

Toolbar toolbar = new Toolbar(applicationContext);

但是当我尝试使用它时却失败了:

Menu menu = toolbar.getMenu();
toolbar.setTitle("");

MenuItem item = menu.add(mContext.getString(R.string.HDLabel));
item.setCheckable(true);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

我得到以下异常:

Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 5: TypedValue{t=0x2/d=0x7f01010b a=-1}
at android.content.res.TypedArray.getColorStateList(TypedArray.java:482)
at android.widget.TextView.<init>(TextView.java:1043)
at android.widget.TextView.<init>(TextView.java:671)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.view.menu.ActionMenuItemView.<init>(ActionMenuItemView.java:72)
at android.support.v7.view.menu.ActionMenuItemView.<init>(ActionMenuItemView.java:68)

其他一些人遇到了同样的问题:Upgrading to SDK 21 - Error inflating class android.support.v7.internal.widget.ActionBarContainer

但我真的想使用 ApplicationContext,因为我希望我的工具栏显示在 activity 之外。有人能做到吗?

编辑:我希望我的工具栏在 SYSTEM_ALTERT_WINDOW 中,就像这里描述的 facebook Messenger 泡泡头:What APIs in Android is Facebook using to create Chat Heads?

显示您的 class。会想办法解决的。

尝试使用此方法获取上下文getApplicationContext()activityName.this

如果能出示代码就更好了

您可以尝试将您的应用程序上下文包装在 ContextThemeWrapper 中,以使用从 AppCompat 扩展的主题来装饰裸应用程序上下文,如下所示:

Context context = new ContextThemeWrapper(getApplicationContext(), R.style.AppTheme);

此上下文将提供所有 AppCompat 属性,以便您可以通过编程方式创建小部件。

如果您想使用 AppCompat 小部件,则必须手动创建它们,例如new AppCompatImageView(...) 而不是 new ImageView(...).

此上下文也不提供 AppCompat 布局 inflater,因此框架小部件 不会 在 inflation 时自动替换为它们的 AppCompat 对应物。