在 style.xml 中定义时,自定义按钮的“android:gravity”不适用

Posted

技术标签:

【中文标题】在 style.xml 中定义时,自定义按钮的“android:gravity”不适用【英文标题】:"android:gravity" for custom button is not applying when defined in styles.xml 【发布时间】:2019-12-31 17:45:59 【问题描述】:

我无法在我在 styles.xml 中定义的按钮中(垂直和水平)居中文本(当所有属性都在布局中时正常工作)

原来所有的属性都是直接在布局中设置的,但是我有很多片段,所有的按钮都是一样的。当 Button 在布局中完全声明时,我什至不需要指定“重力”值,文本会自动居中。

我尝试为某些属性创建样式,但我丢失了文本居中,并且“android:gravity="center"" 在样式和/或布局中不起作用

styles.xml

<!-- GENERAL - BUTTON -->
    <style name="Widget.AppCompat.Button.one_line">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">50dp</item>
        <item name="android:paddingStart">20dp</item>
        <item name="android:paddingEnd">20dp</item>
        <item name="android:paddingBottom">20dp</item>
        <item name="android:fontFamily">@font/roboto_condensed_bold</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">@color/white</item>
        <item name="android:textSize">@dimen/default_text_size</item>
        <item name="android:gravity">center_vertical</item>
    </style>

myLayout.xml

<android.support.constraint.ConstraintLayout>
...
    <Button
        android:id="@+id/btn_back"
        style="@style/Widget.AppCompat.Button.one_line"
        android:background="@drawable/border_green_full"
        android:text="@string/retour"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />
<android.support.constraint.ConstraintLayout>

我希望文本垂直居中。我错过了什么?

【问题讨论】:

删除paddingBottom 你为什么不继承父样式(例如Base.Widget.AppCompat.Button)?默认有&lt;item name="android:gravity"&gt;center_vertical|center_horizontal&lt;/item&gt; @GiddyNaya ...就是这样。我想设置边距而不是填充。我很笨 @GabrieleMariotti 我通过隐式继承从“Widget.AppCompat.Button”继承 @Gilles 真的,我的错 【参考方案1】:

在您的情况下,只需删除:

<item name="android:paddingBottom">20dp</item>

最好使用 parent 样式:

<style name="Widget.AppCompat.Button.one_line" parent="@style/Widget.AppCompat.Button">
 ...
</style>

本例中的默认值为:

<item name="android:gravity">center_vertical|center_horizontal</item>

一般:

原来所有的属性都是直接在布局中设置的,但是我有很多片段,所有的按钮都是一样的

如果您想集中应用所有按钮的样式避免在布局中的任何按钮中指定style 属性,只需使用:

在您的应用主题中使用 Material Theme materialButtonStyle 属性:

类似:

<!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.MaterialComponents.Light">
     ...
    <item name="materialButtonStyle">@style/Widget.MaterialComponents.Button</item>
  </style>
具有 AppCompat 主题 使用 buttonStyle 属性:

类似:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="buttonStyle">@style/Widget.AppCompat.Button</item>
</style>

如果您想自定义样式,请使用 Widget.MaterialComponents.Button/Widget.AppCompat.Button 定义 parent 样式。

【讨论】:

感谢您的进一步解释,我会记住这一点。问题是,我有一些不同的按钮类型,所以我不想为所有应用按钮设置这种样式。【参考方案2】:

我犯了@GiddyNaya所说的错误,显然添加padding_bottom会将文本放在按钮中(我想添加边距,而不是填充......)

【讨论】:

以上是关于在 style.xml 中定义时,自定义按钮的“android:gravity”不适用的主要内容,如果未能解决你的问题,请参考以下文章

安卓UI自定义radiobutton样式

Android中自定义checkbox样式

在 XML 中为 ActionBar 定义自定义徽标(不同于徽标)?

Ueditor 自定义按钮

iOS 导航栏-返回按钮-自定义

自定义Dialog