自定义视图的样式从以编程方式设置的切换按钮扩展而来

Style for custom view extended from ToggleButton set programatically

我从 ToggleButton 扩展并想设置我的样式。当我在 xml 中设置样式时一切正常,例如 style="@style/Button.Filter.Text" 但是当我在自定义 ToggleButton 的构造函数中以编程方式设置样式时,比如 super(context, attrs, R.style.Button_Filter_Text); 我的按钮的样式就像普通的 TextView (可能没有样式)

您不能以编程方式设置样式,好的方法是在 xml 中设置样式,然后对其进行膨胀。查看 this answer to confirm and second one,其中描述了更多的方法。 还有 one more example.

three-argument 构造函数中的参数 int defStyleAttr 可能不适用于自定义样式。来自 Android 文档:

defStyleAttr - An attribute in the current theme that contains a reference to a style resource that supplies default values for the view. Can be 0 to not look for defaults.

要解决这种情况,请使用以下方法:

ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.Button_Filter_Text);
View view = new View(wrappedContext, null, 0);

或者,如果您只支持 LOLLIPOP 和更高版本,则有一个带有 4 个参数的 use 构造函数:

View (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

其中 defStyleAttr 应为 0,defStyleRes 是您的样式 ID