- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
组织专业 android 应用程序按钮样式的最佳做法是什么?假设有一个更大的当代应用程序(SDK 26+,最小 SDK 21)。
这个问题是可以回答的,因为Material Design
的两个来源以及 Android Studio
的设置提供足够的线索和示例,说明预期的专业用途的模式。当然,用户不仅限于这种模式,但遵循它们,可以使应用程序与 Material Design
的来源一起很好地发挥作用。并提供最佳的可维护性。
我发现了几个与按钮样式相关的成分。
@style/Widget.AppCompat.Button
@style/Widget.AppCompat.Button.Colored
@style/TextAppearance.AppCompat.Button
@style/TextAppearance.AppCompat.Widget.Button
@color/foreground_material_dark
?colorAccent
?textColorPrimary
?android:colorForeground
?textAppearanceButton
最佳答案
(最低 SDK 21)
一般的做法
粒度
我认为这是将文本外观与背景分开的足够细粒度的方法。这提供了将不同背景与不同文本外观相结合的选项。它还匹配 Button
提供的两种样式设置和 Material Design 的组织。因此,它解决了如何使用它的问题。
价格是,每个Button
需要两个设置:
android:textAppearance
style
styles_material.xml
实际上采取了一种先进的方法。每个按钮
style
已经包含默认文本外观。所以在正常情况下,我只需要应用按钮
style
.
<Button
style="?defaultButtonStyle"
android:textAppearance
来添加替代文本外观。 .
<Button
style="?defaultButtonStyle"
android:textAppearance="?smallButtonTextAppearance"
Hint: Be aware that
android:textAppearance
has a very low precedence. If you set a text attribute somewhere in the theme (or style), you will overwrite the same attribute in all ofandroid:textAppearance
. It works with a similar force like the "!important" annotation in CSS, which can be a pretty pitfall.
<Button
style="@style/My.DefaultButtonStyle"
android:textAppearance="@style/My.SmallButtonTextAppearance"
...
<Button
style="?defaultButtonStyle"
android:textAppearance="?smallButtonTextAppearance"
...
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<!-- button text appearance -->
<attr name="defaultButtonTextAppearance" format="reference" />
<attr name="smallButtonTextAppearance" format="reference" />
<!-- button backgrounds -->
<attr name="defaultButtonStyle" format="reference" />
<attr name="alarmButtonStyle" format="reference" />
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="OtherTheme" parent="Theme.AppCompat">
<!-- button text appearance -->
<item name="defaultButtonTextAppearance">@style/OtherTheme.DefaultButtonTextAppearance</item>
...
<!-- button backgrounds -->
<item name="defaultButtonStyle">@style/OtherTheme.DefaultButtonStyle</item>
...
data/res/values/styles_material.xml
,它定义了所有按钮文本外观的根。
TextAppearance.Material.Button
继承自
TextAppearance.Material
,但按钮的四个相关属性被覆盖。
<style name="TextAppearance.Material">
<item name="textColor">?attr/textColorPrimary</item>
<item name="textColorHint">?attr/textColorHint</item>
<item name="textColorHighlight">?attr/textColorHighlight</item>
<item name="textColorLink">?attr/textColorLink</item>
<item name="textSize">@dimen/text_size_body_1_material</item>
<item name="fontFamily">@string/font_family_body_1_material</item>
<item name="lineSpacingMultiplier">@dimen/text_line_spacing_multiplier_material</item>
</style>
<style name="TextAppearance.Material.Button">
<item name="textSize">@dimen/text_size_button_material</item>
<item name="fontFamily">@string/font_family_button_material</item>
<item name="textAllCaps">true</item>
<item name="textColor">?attr/textColorPrimary</item>
</style>
TextAppearance.Material.Button
我发现文本颜色由属性
?textColorPrimary
指定.此属性再次基于属性
?android:colorForeground
.
?android:colorForeground
是设置文本颜色的中央开关。默认情况下,所有文本颜色都是基于此设置计算的,按钮的颜色也是如此。例如,为禁用按钮、正文等计算不同等级的灰色或不透明变体。
<item name="android:colorForeground">@color/orange_700</item>
@color/foreground_material_dark
.
Hint 1: If you edit the setting by use of the
Android Studio Theme Editor
, it will possibly change the value of@color/foreground_material_dark
. To me it does not feel like a good idea to change a value of material dark because it is not my realm. Better use a reference like shown before.Hint 2: The
Theme Editor
is an appropriate tool to discover the relations of the color attributes system. This relations reveal, when you experimentally try to edit the different attributes with the editor.
Hint 3: Using
?android:colorForeground
does not work out of the
box below API 26. For a workaround see here.
<style name="My.SmallButtonTextAppearance" parent="My.DefaultButtonTextAppearance">
<item name="android:textSize">16sp</item>
</style>
TextAppearance.Material.Button
从资源中获取文本大小默认值
@dimen/text_size_button_material
.没有与文本颜色设置系统相比具有中央文本大小设置的系统。
TextAppearance.Material.Button
将所有大写设置为
true
.甚至没有资源,值(value)是从中获取的。它只是硬编码。
<item name="textAllCaps">true</item>
false
在我定制的按钮样式中。
<item name="android:textAllCaps">false</item>
TextAppearance.Material.Button
使用字符串资源
@string/font_family_button_material
.
<item name="fontFamily">@string/font_family_button_material</item>
data/res/values/donttranslate_material.xml
这被设置为
sans-serif-medium
, 而在文件
data/res/values-watch/donttranslate_material.xml
中设置为
sans-serif-condensed
.
<string name="font_family_button_material">sans-serif-medium</string>
<string name="font_family_button_material">sans-serif-condensed</string>
sans-serif
设置映射到我在字体设置中选择的字体系列。通常
sans-serif
适用于按钮文本。为了进一步自定义字体,我指向
this question .
style
背景不应包含
width
的设置,
height
或
margins
,因为这属于周围的布局。另一方面
padding
属于后台
style
.
data/res/values/styles_material.xml
我找到了九种可以继承的按钮样式。如果我自己写,不要忘记设置默认文本外观。
Widget.Material.Button
.它将默认文本外观设置为
?textAppearanceButton
.因此,设置此属性是一个选项,可以直接使用 Material Design 按钮样式而无需继承,但具有自定义的默认文本外观。
<!-- Bordered ink button -->
<style name="Widget.Material.Button">
<item name="background">@drawable/btn_default_material</item>
<item name="textAppearance">?attr/textAppearanceButton</item>
<item name="minHeight">48dip</item>
<item name="minWidth">88dip</item>
<item name="stateListAnimator">@anim/button_state_list_anim_material</item>
<item name="focusable">true</item>
<item name="clickable">true</item>
<item name="gravity">center_vertical|center_horizontal</item>
</style>
?colorAccent
用于设置
Widget.AppCompat.Button.Colored
的颜色.见
Android Studio Theme Editor
.见
@drawable/btn_colored_material
.
Widget.AppCompat.Button.Colored
的默认文本外观变化并且不是由可定制的属性设置的。
<!-- Colored bordered ink button -->
<style name="Widget.Material.Button.Colored">
<item name="background">@drawable/btn_colored_material</item>
<item name="textAppearance">@style/TextAppearance.Material.Widget.Button.Colored</item>
</style>
<!-- Small bordered ink button -->
<style name="Widget.Material.Button.Small">
<item name="minHeight">48dip</item>
<item name="minWidth">48dip</item>
</style>
<!-- Borderless ink button -->
<style name="Widget.Material.Button.Borderless">
<item name="background">@drawable/btn_borderless_material</item>
<item name="stateListAnimator">@null</item>
</style>
Widget.Material.Button.Borderless.Colored
的默认文本外观变化并且不是由可定制的属性设置的。
<!-- Colored borderless ink button -->
<style name="Widget.Material.Button.Borderless.Colored">
<item name="textAppearance">@style/TextAppearance.Material.Widget.Button.Borderless.Colored</item>
</style>
Widget.Material.Button.ButtonBar.AlertDialog
继承自
Widget.Material.Button.Borderless.Colored
.适用于默认文本外观的相同限制。
<!-- Alert dialog button bar button -->
<style name="Widget.Material.Button.ButtonBar.AlertDialog" parent="Widget.Material.Button.Borderless.Colored">
<item name="minWidth">64dp</item>
<item name="minHeight">@dimen/alert_dialog_button_bar_height</item>
</style>
<!-- Small borderless ink button -->
<style name="Widget.Material.Button.Borderless.Small">
<item name="minHeight">48dip</item>
<item name="minWidth">48dip</item>
</style>
<style name="Widget.Material.Button.Inset">
<item name="background">@drawable/button_inset</item>
</style>
<style name="Widget.Material.Button.Toggle">
<item name="background">@drawable/btn_toggle_material</item>
<item name="textOn">@string/capital_on</item>
<item name="textOff">@string/capital_off</item>
</style>
Widget.Material.Button
继承我自己的样式。 .这使继承的层次结构保持在较低水平并且代码易于阅读。如果我从另一种风格继承,它最多可以节省我三行代码,而代码变得更不易维护。
@drawable/btn_borderless_material
是私有(private)的。所以我要么必须继承
Widget.Material.Button.Colored
或创建文件的副本。
关于android - 如何专业地组织按钮的样式? (SDK 26+,最低 SDK 21),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50424396/
所以我有这个 javascript 片段,它有两个按钮可以进入全屏,一个按钮可以退出全屏。我想做到这一点,如果我不在全屏模式下,按钮会显示转到全屏模式,而当我处于全屏模式时,按钮会显示退出全屏模式..
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我尝试将 Twitter 上的“Tweet Me”按钮 ( http://twitter.com/goodies/tweetbutton ) 添加到我的网站。然而,每当按下按钮时,我都会收到此 Jav
我试图在我的文本区域中获取一个按钮值,如果我使用 则工作正常但如果我使用那么它就不起作用了。你能找出问题所在吗? HTML 1 2 3 4 JavaScript $(document).read
我的 C# Winform 面板中有一堆文本框。每行文本框的命名如下: tb1 tbNickName1 comboBox1 tb2 tbNickName2 comboBox2 tb3 tbNickNa
我有一个表单,其中过滤器下方有按钮(应用过滤器和清除过滤器),我试图在单击“应用”按钮时显示“清除”,并在单击“清除”按钮时隐藏“清除”按钮。 下面的代码(如果我的表有的话):
excel 按钮正在工作,但是当我添加 pdf 按钮时,它添加仅显示 pdf 按钮 excel 按钮在 pdf 按钮添加后隐藏 $(document).ready(function() { $
我想创建一个 div 作为标题并分成 3 列,并按以下顺序在其中放置 2 个按钮和一个标题:Button1(左位) Title(居中) Button2(右位) 这是我为这个 div 编写的代码:
仅当选中所有框时才应禁用“允许”按钮。我该怎么做?我已经完成了 HTML 部分,如下所示。如何执行其中的逻辑部分?即使未选中一个复选框,也应禁用“允许”按钮
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如您所知,您可以使用 2 种方法在 HTML5 中呈现按钮: 使用 void 元素 或 如果您需要内容,请使用 元素(不是空元素)。 在JSF2中,有2种方式生成按钮;与UICommand或 UIOu
我尝试根据表单元素的更改禁用/启用保存按钮。但是,当通过弹出按钮选择更改隐藏输入字段值时,保存按钮不受影响。 下面是我的代码。我正在尝试序列化旧的表单值并与更改后的表单值进行比较。但我猜隐藏的字段值无
我有用于在消息(电子邮件、短信)上输入内容的 EditText。我希望在单击 ActionDone 按钮时立即发布消息。我为此使用以下代码: message.setOnEditorActionList
我的 Android 应用程序中有一堆 EditText,每个都将 InputMethod 设置为 numberSigned。我的目标设备没有硬件键盘,而是使用软件键盘输入数字。 Android 将输
我无法以编程方式隐藏弧形菜单中的 fab 按钮。我正在使用https://github.com/saurabharora90/MaterialArcMenu在我的代码中。如何在Java中以编程方式隐藏
我已经看到这在其他类型的对话框窗口中是可能的,例如“showConfirmDialog”,其中可以指定按钮的数量及其名称;但是使用“showInputDialog”时是否可以实现相同的功能?我似乎无法
相同的按钮用于激活和停用。第一次,当代码运行按钮单击并成功“停用”时。但第二次,代码无法找到该元素。第一个案例按钮位于第二个“a”标签中,然后停用第一个“a”标签中的按钮。 案例1: Edit
是否可以将按钮的 onclick 操作设置为 JavaScript 变量?这个想法是我们用 JavaScript 控制一个表。每当点击该表的一行时,我们就会更新一个 JavaScript 变量。该 v
我想创建一个按钮,它包含左侧的文本和右侧的复选框(或任何其他组件)。我怎样才能做到这一点? 我发现我可以制作自己的 View extends Button,但是如果可以的话我应该如何实现 onDraw
我是一名优秀的程序员,十分优秀!