Java 在自定义视图中应用内置Android小部件样式

Java 在自定义视图中应用内置Android小部件样式,java,android,android-custom-view,android-styles,android-custom-attributes,Java,Android,Android Custom View,Android Styles,Android Custom Attributes,我已经阅读并理解了,但是我想要的不是一般的样式和覆盖单个小部件样式,而是作为子小部件一部分的样式 比如说,我有一个复合的RelativeLayout,它由一个标准的EditText和一个标准的按钮组成。我可以覆盖android:buttonStyle来设计这个按钮,但我真正想要的是 <my.custom.Widget ... pkg:buttonStyle="@style/CustomStyle" /> 其中,CustomStyle可以派生自android:style/

我已经阅读并理解了,但是我想要的不是一般的样式和覆盖单个小部件样式,而是作为子小部件一部分的样式

比如说,我有一个复合的
RelativeLayout
,它由一个标准的
EditText
和一个标准的
按钮组成。我可以覆盖android:buttonStyle来设计这个按钮,但我真正想要的是

<my.custom.Widget
  ...
  pkg:buttonStyle="@style/CustomStyle" />

其中,
CustomStyle
可以派生自
android:style/Widget.Button
,但是对于
my.custom.Widget
的每个实例都可以更改,因为
pkg:buttonStyle

我知道的唯一替代方法是将所有可设置样式的属性分别添加到我的
attrs.xml
(如果两个或多个子小部件需要相同的属性,但具有不同的值,则通常会发生冲突)然后在
my.custom.Widget
的构造函数/init方法中手动复制/设置所有这些属性

有没有办法做到这一点?

在自定义视图中使用内置小部件样式 如果您创建的自定义视图是Android小部件的子类,并且希望使用内置的Android小部件样式对其进行样式设置,那么您必须实现以下结构


更改自定义
视图
以从Android小部件样式继承其属性 CustomTextView.java

Context#obtainStyledAttributes()
defStyleAttr
参数用于指定对要继承的样式的引用。在本例中,使用
R.attr.customImageButtonStyle
。您可以在
themes.xml
style.xml
中定义这些资源

themes.xml


@style/Widget.TextView
styles.xml


自定义字体
attrs.xml


*活动\u布局*

<com.packagename.ui.view.CustomTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Bacon ipsum" />


CustomTextView
不再要求您定义样式或
customTypeface
属性,它已在
themes.xml

中的主题范围
customTextViewStyle
中定义。不幸的是,这似乎不可能。我能找到的唯一一个类似的例子是
ActionBar
:您可以传入标题、副标题和进度指示器的样式。查看的源代码,标题和副标题
TextView
s”样式应用于
settextearance()
。有一个额外的构造函数,它接受样式的第四个参数。由于大多数
视图
类没有这个额外的构造函数,因此无法向它们传递样式。但是,有几个备选方案:

  • 传递子视图的布局而不是样式,并在小部件中放大它
  • 如果子视图是
    TextView
    的子视图(如
    按钮
    EditText
    是),则对传递的样式使用
    setTextAppearance()
    。这将为文本应用一些好的样式。如果您想允许用户应用其他样式,如背景或填充,您仍然需要为每个样式添加自定义属性。如果您正在制作一个复合小部件,那么用户很有可能不需要对子视图应用所有可能的样式,因此仅公开一个子集可能就足够了
  • 如前所述,添加一个主题范围的样式
    这是怎么回答我的问题的?我特别询问了如何处理复合小部件……无论组件的数量如何,这都会起作用。只需在所有复合视图中重复使用
    CustomTheme
    属性即可。每个视图都将能够使用引用样式中定义的所有属性。
    <resources>
        <style name="AppTheme">
            <!--Define a theme-wide customTextViewStyle -->
            <item name="customTextViewStyle">@style/Widget.TextView</item>
        </style>
    </resources>
    
    <resources>
        <style name="Widget.TextView"
            parent="@android:style/Widget.TextView">
            <item name="customTypeface">custom_font_typeface</item>
        </style>
    </resources>
    
    <resources>
        <declare-styleable name="CustomTextView">
            <attr name="customTypeface" format="string" />
        </declare-styleable>
        <declare-styleable name="CustomTheme">
            <attr name="customTextViewStyle" format="reference"/>
        </declare-styleable>
    </resources>
    
    <com.packagename.ui.view.CustomTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Bacon ipsum" />