Android:如何通过代码为Toolbar设置主题?
解决代码创建Toolbar时样式找不到的问题
这个问题我之前碰到过,核心原因是你找错了样式的资源归属——ThemeOverlay.AppCompat.ActionBar是AppCompat支持库提供的样式,并不在系统的android.R.style里,所以才会报“cannot find symbol”错误。下面是具体的解决步骤和完整代码示例:
1. 导入正确的资源类
确保你导入的是应用模块的R类或者AppCompat库的专属R类,而不是系统自带的android.R。比如:
import com.your.app.package.R; // 替换成你自己的应用包名 // 或者导入AppCompat库的R类(优先推荐用自己模块的R,避免自定义样式冲突) // import android.support.v7.appcompat.R;
2. 修正样式资源的引用
把代码里的android.R.style.ThemeOverlay_AppCompat_ActionBar替换成R.style.ThemeOverlay_AppCompat_ActionBar,因为这个样式属于AppCompat库,存在于你的应用资源体系中,而非系统资源。
3. 完整代码示例(还原XML所有属性)
代码创建Toolbar时,XML里的所有属性都需要手动配置,这里给你还原所有你在XML里设置的参数:
// 创建Toolbar实例 android.support.v7.widget.Toolbar actionBar = new android.support.v7.widget.Toolbar(getContext()); // 设置宽高参数,对应XML的layout_width和layout_height ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material) // 对应?attr/actionBarSize ); actionBar.setLayoutParams(params); // 设置背景色,对应XML的android:background="?attr/colorPrimary" TypedValue colorPrimary = new TypedValue(); getContext().getTheme().resolveAttribute(R.attr.colorPrimary, colorPrimary, true); actionBar.setBackgroundColor(colorPrimary.data); // 设置阴影高度,对应XML的android:elevation="4dp" actionBar.setElevation(4f * getResources().getDisplayMetrics().density); // 设置ActionBar主题,对应XML的android:theme="@style/ThemeOverlay.AppCompat.ActionBar" TypedValue actionBarTheme = new TypedValue(); getContext().getTheme().resolveAttribute(R.style.ThemeOverlay_AppCompat_ActionBar, actionBarTheme, true); actionBar.setTheme(actionBarTheme.data); // 设置弹出菜单主题,对应XML的app:popupTheme="@style/ThemeOverlay.AppCompat.Light" TypedValue popupTheme = new TypedValue(); getContext().getTheme().resolveAttribute(R.style.ThemeOverlay_AppCompat_Light, popupTheme, true); actionBar.setPopupTheme(popupTheme.data);
补充说明
如果你的项目已经迁移到AndroidX,记得把android.support.v7.widget.Toolbar替换为androidx.appcompat.widget.Toolbar,对应的样式资源类也可以换成androidx.appcompat.R或者保持自己模块的R类即可。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

