【问题标题】:Style for custom view extended from ToggleButton set programatically自定义视图的样式以编程方式从切换按钮集扩展
【发布时间】:2017-02-05 23:44:44
【问题描述】:

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

【问题讨论】:

    标签: android android-custom-view android-styles


    【解决方案1】:

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

    【讨论】:

    • 在这种情况下,我的自定义按钮必须是 ViewGroup,因为我应该在某个地方添加这个膨胀的 ToggleButton。我理解正确吗?仅由于此样式问题,我生成了不必要的视图层和代码结构,这非常难看。
    • no ButtonView,您必须将其添加到父级 ViewGroup。这很丑我同意。另外,如果我正确理解了目的,您可以在drawable 中创建一个selector 并将一些样式设置为背景。这是来自“第二个”的答案。
    • 好的,我改变了我的自定义视图的结构并将 ToggleButton 包装到 FrameLayout 丑陋,但在这种情况下用途广泛。为我无法以编程方式完成的信息干杯。
    【解决方案2】:

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

    defStyleAttr - 当前主题中的一个属性,它包含对样式资源的引用,该资源为 看法。可以为 0 以不查找默认值。

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

    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

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2015-02-04
      相关资源
      最近更新 更多