Fra*_*ran 1 android coding-style android-layout
我不确定在Android中开发界面的最佳方法是什么.通过将内联属性移动到样式文件来清理布局文件是否更好?据我所知,在HTML中最好在HTML中使用类和ID,并在style.css文件中使用它们.安卓怎么样?
我找到了这个,也许它可以帮助别人.
我们必须解决的第一个问题很简单:何时应该使用样式而不是内联属性?
规则#1:当多个视图在语义上相同时使用样式.
通过以下几个示例可以最好地说明此规则:
所有这些示例中的共同点是,这些Views不仅仅使用相同的属性 - 它们在整个应用程序中扮演相同的角色.现在,当您想要调整其中任何一个的外观时Views,您可以只编辑样式并立即更改它们.它可以节省您的时间和精力,并保持您的Views一致性.
想要节省更多的工作?使用资源引用!
规则#2:在适当的时候使用样式中的引用.
您可以这样定义样式:
<style name="MyButton">
<item name="android:minWidth">88dp</item>
<item name="android:minHeight">48dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)
如果您想minWidth根据屏幕尺寸变化怎么办?您可以在每个屏幕大小(例如,sw600dp和sw900dp)中复制一次样式,但是您也必须复制该minHeight属性.如果您希望两个属性都发生变化怎么办?突然间,你MyButtons到处都有大量的定义,每个都重复所有其他属性.这是灾难的秘诀; 很容易忘记在多个副本之一中更改一个属性.
样式只是一系列属性的别名.这样定义样式要容易得多:
<style name="MyButton">
<item name="android:minWidth">@dimen/button_min_width</item>
<item name="android:minHeight">@dimen/button_min_height</item>
</style>
Run Code Online (Sandbox Code Playgroud)
现在,您只需修改每个资源限定符的单个属性即可.考虑重复布局只是为了改变,比如View纵向和横向的宽度,这是荒谬的.你会使用维度.这同样适用于款式.
我并不是说暗示你应该总是在样式中使用资源引用; 只是你应该使用它,如果你需要在资源限定符上切换多个值.
这并不是说有时您不需要跨资源限定符复制样式,但您可以将其保持在最低限度.通常这样做的唯一原因是因为平台的变化(例如,从变化paddingLeft和paddingRight对paddingStart和paddingEnd).
如果您可以将多种样式应用于单个内容View(如CSS),那将是非常棒的.
你不能.抱歉.
但是,在某些情况下,您可以获得多种样式的近似值.
规则#3:使用主题调整默认样式.
主题提供了定义许多标准小部件的默认样式的方法.例如,如果要为应用程序定义默认按钮,则可以执行以下操作:
<style name="MyTheme">
<item name="android:buttonStyle">@style/MyButton</item>
</style>
Run Code Online (Sandbox Code Playgroud)
如果你只是调整默认样式,唯一棘手的部分是弄清楚你的风格的父母; 您希望它匹配设备的相应主题,但这取决于操作系统版本.
如果您使用的是AppCompat主题,则应将其样式用作父级,因为它们也可以处理不同平台之间的差异.例如,他们有一种Spinner风格:
<style name="MySpinner" parent="Widget.AppCompat.Spinner" />
Run Code Online (Sandbox Code Playgroud)
如果AppCompat中不存在该样式(或者您没有使用它),则问题有点棘手,因为您需要父级基于主题进行切换.这是一个Button通常使用Holo 的自定义样式的示例,但适当时使用Material.
你把它放进去/values/values.xml:
<style name="ButtonParent" parent="android:Widget.Holo.Button />
<style name="ButtonParent.Mine">
<item name="android:background">@drawable/my_bg</item>
</style>
Run Code Online (Sandbox Code Playgroud)
然后,在/values-v21/values.xml:
<style name="ButtonParent" parent="android:Widget.Material.Button />
Run Code Online (Sandbox Code Playgroud)
设置正确的父级将确保您的应用程序和平台的一致性.
如果你真的想要定义所有必要的属性(而不是仅仅调整默认值),你可以完全跳过父母.
规则#4:尽可能使用文本外观.
TextAppearance允许您为一些最常修改的文本属性合并两种样式.看看你的所有风格:它们中有多少只修改文本的外观?在这些情况下,您可以改为修改TextAppearance.
首先,您需要定义TextAppearance:
<style name="MyTextAppearance" parent="TextAppearance.AppCompat">
<item name="android:textColor">#0F0</item>
<item name="android:textStyle">italic</item>
</style>
Run Code Online (Sandbox Code Playgroud)
请注意我是如何设置父项的 - 文本外观不会合并,因此您需要确保定义所有属性.您可以使用任何适当TextAppearance的父作为.
现在您可以在以下位置使用它TextView:
<TextView
style="@style/MyStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/MyTextAppearance" />
Run Code Online (Sandbox Code Playgroud)
请注意,我仍然可以为此应用一种样式TextView,让我为一个视图获得惊人的两种样式!不如真正的多种风格,但我会采取我能得到的.
您可以TextAppearance在任何扩展的类中使用TextView.这意味着EditText,Button等所有支持文本样式.
我在使用样式时已经解释了所有的时间.不幸的是,从长远来看,很容易滥用款式会对你造成伤害.这里有一些要避免的反模式.
规则#5:如果只使用一次,请不要创建样式.
样式是一个额外的抽象层.它增加了复杂性.您必须查找样式才能查看它们应用的属性.因此,除非你打算在多个地方使用这种风格,否则我认为没有理由使用它们.
当你打开一个布局时,你宁愿看到哪个:这个?
<TextView style="HelloWorldTextView" />
Run Code Online (Sandbox Code Playgroud)
或这个?
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
Run Code Online (Sandbox Code Playgroud)
它是那么容易,并随后建立的风格,如果你需要的话.不要过早计划.
规则#6:不要仅因为多个视图使用相同的属性而创建样式.
使用样式的主要原因是减少重复属性的数量,对吧?为什么不在多个视图使用相同属性时使用样式?
这种态度的问题在于Views,如果它们不在相同的环境中使用,那么最终可能希望它们的外观不同.此时,您的基本样式变得难以编辑而没有意外的副作用.
想想这个场景:你有一些TextViews相同的文字外观和背景.你认为,"嘿,我会创造一种风格,这将减少代码重复." 一开始一切都很笨拙,但最终你想要调整一些TextViews外观.问题是,到目前为止,这个样式被遍地使用,因此如果没有一些附带损坏,你就无法编辑它.
好吧,你说 - 我将直接在布局XML中覆盖样式.问题解决了.然后又发生了.然后再次.最终这种风格毫无意义,因为你不得不在任何地方覆盖它.它最终增加了额外的工作,而不是让生活更轻松.
这就是我在规则#1中指定在语义相同时应该使用样式的Views原因.这可确保当你改变一种风格,你真的不希望每次使用样式改变.View
样式支持父级,其中子样式采用父样式的所有属性.如果他们没有,那将是相当有限的.
假设我希望Button应用程序中的每个人看起来都一样,所以我做了一个ButtonStyle.后来,我决定一半Buttons应该看起来略有不同 - 与育儿,我可以创建ButtonStyle.Different,获得基本风格+调整.
事实证明,有两种方式可以隐式和明确地定义父母:
<!-- Our parent style -->
<style name="Parent" />
<!-- Implicit parenting, using dot notation -->
<style name="Parent.Child" />
<!-- Explicit parenting, using the parent attribute -->
<style name="Child" parent="Parent" />
Run Code Online (Sandbox Code Playgroud)
很简单吧?但是,当我们用两种方法定义父母时,你认为这里发生了什么?
<style name="Parent.Child" parent="AnotherParent" />
Run Code Online (Sandbox Code Playgroud)
如果你回答这个风格有两个父母,那你错了.事实证明它只有一个父母:AnotherParent.
每种样式只能有一个父项,即使有两种方法可以定义它.显式父(使用属性)优先.这导致我接下来的规则:
规则#7:不要混合隐式和显式父母.
混合这两者是混淆的一个秘诀.假设我有这个布局:
<Button
style="@style/MyWidgets.Button.Awesome"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)
但事实证明我的风格是这样定义的:
<style name="MyWidgets.Button.Awesome" parent="SomethingElse" />
Run Code Online (Sandbox Code Playgroud)
即使它看起来像我Button的基础MyWidgets.Button,但事实并非如此!样式名称具有误导性,发现它的唯一方法是做额外的工作并深入挖掘样式文件.
常见的诱惑是继续使用带有显式父项的点表示法,以便您的样式看起来与层次结构相关:
<style name="MyButton" parent="android:Widget.Holo.Button" />
<style name="MyButton.Borderless" parent="android:Widget.Holo.Button.Borderless" />
Run Code Online (Sandbox Code Playgroud)
面向对象的风格!它们看起来很漂亮,对吧?但看起来就是你所得到的 - 一种幻想,即风格与它们无关.欺骗MyButton.Borderless与此有关MyButton,但它们没有任何共同之处!让我们通过删除名称中的点来消除混淆:
<style name="MyButton" parent="android:Widget.Holo.Button" />
<style name="MyBorderlessButton" parent="android:Widget.Holo.Button.Borderless" />
Run Code Online (Sandbox Code Playgroud)
我在层次结构上看起来很漂亮,但我在代码中获得了很多实用工具.
样式和主题是两个不同的概念.当样式适用于单个样式时View,主题应用于一组Views(或整体Activity).
例如,假设您正在使用AppCompat,并且您想要为屏幕设置主要颜色.为此,您必须以整个主题为主题Activity:
<style name="MyTheme">
<style name="colorPrimary">@color/my_primary_color</style>
</style>
Run Code Online (Sandbox Code Playgroud)
主题使用与样式相同的数据结构 - 甚至使用style标记 - 但实际上它们在完全不同的情况下使用!它们不在相同的属性上运行 - 例如,您可以textColor在View上定义a ,但textColor主题没有属性.同样地,存在colorPrimary主题,但在样式中它们未被使用.从而:
规则#8:不要混合样式和主题.
我见过的两个常见错误:
从Lollipop开始,您可以将主题应用于其View所有孩子2.即使在这种情况下,你也不应该混淆两者,尽管你可以同时使用它们:
<View
style="@style/MyView"
android:theme="@style/MyTheme" />
Run Code Online (Sandbox Code Playgroud)
AppCompat有一个View主题的模拟Toolbar,但这是你得到的一段时间,直到Lollipop是你的应用程序的最低支持版本.换句话说 - 您可以在几年内享受此功能.:P
这些规则的统一要素是要细心和周到使用样式时.它们可以节省您的时间,但前提是您知道何时使用它们.
字体:这篇文章
| 归档时间: |
|
| 查看次数: |
1266 次 |
| 最近记录: |