xml使用场景,引用写好的xml布局的关键字
前言我们在开发的时候,接触最多的是xml布局。还记得我们为Android编写第一个Hello World时,它是通过activity_main.xml显示的吗
虽然有很多用xml写的东西,也没有什么技术难度,但往往是最容易被忽略的地方。写xml并不难,写好xml还是要下点功夫的。
什么是好的xml布局?我认为有两个核心点,一是提高开发效率,二是提高app性能。围绕这两点,我还精心整理了17个xml布局小技巧。让我们来看看它们。你掌握了多少?
官网是这样介绍的:
Space是一个轻量级视图子类,可用于在常规布局中创建组件之间的间距。
为什么是轻量级的?是因为空间的绘制方法是空的,也就是什么也没画出来。只有onMeasure方法测量宽度和高度。
看一下源代码:
公共最终类空间扩展视图{
/**
*什么也不画。
*
* @param canvas未使用的参数。
*/
@覆盖
公共空白绘制(画布画布){
}
//.
@覆盖
受保护的void on measure(int width measurespec,int heightMeasureSpec) {
setMeasuredDimension(
getdefaultsize 2(getsuggestedminimumwwidth()、widthMeasureSpec),
getdefaultsize 2(getSuggestedMinimumHeight()、heightmessegypt));
}
}所以当空间作用于组件之间的间距时,绘图效率更高,尤其是需要动态修改间距的时候。
例如,如果要动态修改组件的边距,如果使用空格作为间距,则只需修改空格的宽度或高度。因为减少了绘图过程,所以比绘制其他组件效率更高。
使用起来也很简单:
空间
android:id=@ id/space
android:layout_width=20dp
Android:layout_height=20dp/如果你愿意,空格完全可以代替边距,但不一定能代替填充,因为填充是内边距。如果填充有背景色,则不能用空格替换。因为Space的draw方法不画任何东西,所以也不会有背景色,除非在父视图中设置了背景色。
距离2018年GuideLineConstraintLayout第一个正式版发布已经过去了4年多。它通过扁平化布局有效地解决了层次嵌套的问题,不仅比RelativeLayout更灵活,而且性能更好。另外,通过可视化工具拖拽编辑,效率大大提高。如果你还没用过,建议你试试。
在使用ConstraintLayout的过程中,我发现有些学生总是忽略GuideLine。尽管ConstraintLayout非常有用,但有些布局看起来仍然很笨拙。而且如果你能很好的利用GuideLine,你会发现布局更简单,更容易适应。
GuideLine constraint layout的辅助对象,仅用于布局定位。它被标记为视图。消失,不会显示在设备上。
看一下源代码:
公共类指南扩展视图{
公共指南(上下文上下文){
超级(上下文);
super.setVisibility(查看。不见了);
}
公共指南(上下文上下文、属性集属性){
super(上下文,attrs);
super.setVisibility(查看。不见了);
}
公共指南(上下文Context,AttributeSet attrs,int defStyleAttr) {
super(context,attrs,defStyleAttr);
super.setVisibility(查看。不见了);
}
公共指南(Context context,AttributeSet attrs,int defStyleAttr,int defStyleRes) {
super(context,attrs,defStyleAttr);
super.setVisibility(查看。不见了);
}
//.
@ suppress lint( missing supercall )
@覆盖
公共空白绘制(画布画布){
}
@覆盖
受保护的void on measure(int width measurespec,int heightMeasureSpec) {
setMeasuredDimension(0,0);
}
//.
}标记为视图。此super.setVisibility(视图)设置的默认值已不存在。不见了)。不显示是因为draw方法为空,与上面的空格相同。
导轨可以3种不同的方式帮助定位:
Layout_constraintGuide_begin指定距布局左侧或顶部的固定距离layout_constraintGuide_end指定距布局右侧或底部的固定距离layout_constraintGuide_percent指定布局宽度或高度的百分比。您也可以指定不同的方向:
在水平垂直参考线下方,简要演示效果:
箭头所指的地方就是创建指南的地方,当然不仅仅是指南。例如,屏障的第一个红色方框中有水平参考线,位于70%。百分比可以很好的解决适配问题。但是我们的常规做法是用LinearLayout进行嵌套,然后设置子视图的权重。虽然筑巢不多,但也是在筑巢,就像怀孕一样。你不能说你只怀了一点点.第二个红框是垂直参考线,从左边30dp。这种情况适合多个子视图对齐到一个目标距离,也减少了层次嵌套的问题,节省了另一个嵌套层设置填充,或者多个子视图分别设置边距。右边如果要指定位置换行,可以了解一下Barrier~xml代码,就不贴了。已经上传到Github了。点击查看。
包括当我们编写一个复杂的页面时,xml代码可能有数百甚至数千行,阅读起来总是很麻烦。如果有许多嵌套的RelativeLayout,那么各个组件之间的依赖关系就很复杂,看起来甚至更大。这时候可以考虑提取一波,用总分的模式分成页眉、内容、页脚。进一步将内容区域逐个提取到独立的子布局中,然后用include标签引入到根布局中,这和我们的项目架构设计是一样的,一个shell项目加N个子模块。子布局只需要处理好自己的内部布局,整体交给父布局,这样整体布局就清晰了。想了解详情可以去子布局。
例如:
include layout= @ layout/content _ scrolling /content _ scrolling是我们拉出的子布局。
属性tools:showIn通常与include标记一起使用。当我们取出子布局时,它的布局是相对独立的,但它总是需要被包含在根布局中。如果在子布局的时候能在父布局中看到它的效果,那就事半功倍了。
以上content_scrolling.xml:
实际上,布局中只有一个TextView,但是在预览视图中也可以看到FloatingActionButton,这意味着使用了tools:showIn属性。当子布局嵌入父布局时,只需要用tools:showIn在子布局的根布局中指定父布局,就可以在父布局中实时预览效果。
?xml版本=1.0 编码=utf-8 ?
Android x . core . widget . nested scroll view
xmlns:Android= http://schemas . Android . com/apk/RES/Android
xmlns:app= http://schemas . Android . com/apk/RES-auto
xmlns:tools= http://schemas . Android . com/tools
Android:layout _ width= match _ parent
Android:layout _ height= match _ parent
app:layout _ behavior= @ string/app bar _ scrolling _ view _ behavior
工具:context= com . yechaoa . material design . activity . collapsingtoolbaractivity
工具:showIn= @ layout/activity _ collapsing _ toolbar
带边框的
Android:layout _ width= wrap _ content
Android:layout _ height= wrap _ content
Android:layout _ margin= @ dimen/text _ margin
Android:text= @ string/large _ text /
/androidx . core . widget . nested scroll view即:tools:showin= @ layout/activity _ collapsing _ toolbar 。
ViewStubViewStub是一个轻量级的条件视图组件。在进行秒级打开页面等性能优化时,延迟加载是常用手段。
轻量级是因为ViewStub和Space一样,draw方法是空的。
视图的场景。比如当我们需要根据条件判断显示哪个视图时,我们一般会把每个场景的视图写在页面中,然后根据条件设置视图的可见性。这样做的缺点是,即使视图是视图。之后,在呈现和加载页面时,创建的对象仍将被实例化,其属性也将被初始化。很明显,这是一种资源浪费,所以此时使用ViewStub是一种很好的优化方法。
当我们确切地知道需要显示哪个视图时,我们通过ViewStub导入实际的视图,从而避免了资源的浪费。
只有在调用ViewStub.inflate()时,才会加载布局并创建对象实例化。
示例:
视图存根
android:id=@ id/stub_import
Android:inflated id= @ id/panel _ import
Android:layout= @ layout/progress _ overlay
Android:layout _ width= fill _ parent
Android:layout _ height= wrap _ content
Android:layout _ gravity= bottom /inflate:
findViewById视图(R.id.stub_import)。能见度=视野。看得见的
//或者
val panel:view=findviewviewtub(r . id . stub _ import)。Inflate()工具:TextTextView是我们使用最多的组件之一。经常会有这样的需求“标题不能显示没有.而是”。你熟悉它吗?
如果标题是动态数据,默认显示app名称,获取数据后更新。在这种情况下,你通常会在android:text中添加字符进行调试,然后在调试后将其更改为默认的app名称。其实你不用这么麻烦。可以直接默认app名称,然后使用tools:text属性预览字符溢出的效果。
?xml版本=1.0 编码=utf-8 ?
TextView xmlns:Android= http://schemas . Android . com/apk/RES/Android
xmlns:tools= http://schemas . Android . com/tools
android:id=@ id/item_textView
android:layout_width=100dp
Android:layout _ height= wrap _ content
android:maxLines=1
android:ellipsize=end
android:text=TextView
Tools:text= textview textview /Android:text中仍然显示默认副本,在tools:text中可以预览超限效果。实际效果是android:text,只是方便我们调试预览,提高效率,减少编译等待时间。
工具:可见性该属性用于预览未显示的视图。
比如在个人中心页面,需要在昵称后面给一个文案提示“开会员”,默认不显示,即android:visibility=gone 。文案只有在判断不是会员后才会显示。但在开发过程中,需要调试成员和非成员两种显示效果,即可以通过工具预览显示效果:visibility=visible ,节省编译和运行数据,方便快捷。
代码示例:
带边框的
工具:可见性=visible
安卓:可见性=“消失”
Android:layout _ width= wrap _ content
Android:layout _ height= wrap _ content
Android:background= @ color/green primary
安卓:重力=中心
android:padding=10dp
Android:text=开放会员
Android:text color= @ color/white /RecyclerViewrecyclerview也是我们使用频率非常高的组件。通常,recyclerview在xml中是这样定义的:
Android x . recycle view . widget . recycle view
android:id=@ id/recycleView
Android:layout _ width= match _ parent
Android:layout _ height= wrap _ content /效果是这样的:
其实你根本看不到RecyclerView在页面上显示的效果,只能在每次编译运行时才能看到效果,这无疑会耗费我们大量宝贵的时间。这里有一些可以帮助你提高效率的属性。
Tools:listitem我们可以通过设置tools:listitem属性来预览该项的显示效果,该属性指定了一个布局。
tools:listitem= @ layout/item _ main 效果:
工具:itemCount预览项目显示在RecyclerView中设置数量的效果,例如:
工具:itemCount=3 将显示3个项目的效果。
tools:list header tools:list header= @ layout/item _ header 与tools:listitem具有相同的效果。
tools:listfooter的效果与tools:listitem相同。
tools:list footer= @ layout/item _ footer app:layout manager上面RecyclerView的效果默认是垂直的。我们都知道RecyclerView必须用layoutmanager设置后才能显示。我们通常用代码来设置它,比如:
m binding . recycle view . layoutManager=gridlayoutmanager(this,2)其实也可以通过app:layoutManager属性在xml中设置layout manager,比如:
app:布局管理器= androidx。回收视图。小部件。 linearlayoutmanager 默认的LinearLayoutManager是垂直方向的,如果我们想要改方向可以通过安卓:定位属性,比如:
安卓:方向=水平这样就可以在编写可扩展标记语言的时候顺手就加上了,既可以查看预览效果,也避免了代码忘记设置的尴尬情况。
应用程序:spanCount上面的示例中上一篇的布局管理器指定了LinearLayoutManager,我们还可以指定为GridLayoutManager,但是GridLayoutManager默认的跨度是1,如果我们需要设置跨度为2,那该怎么预览呢,这时候就用到了应用程序:spanCount属性,可以指定需要显示的列数。
应用程序:spanCount=2 效果:
安卓:色调着色器,这个属性在之前的包体积优化中有提到,可以减少图片数量,从而减小包大小。
我们通常会用图片显示一张图片,比如原本是一个白色的返回图标,现在另一个地方要用黑色的了,就不需要使用黑白两张图了,而是使用色彩来修改为黑色即可,当然,也有局限,适合纯色图片。
效果:
示例:
线性布局
Android:layout _ width= wrap _ content
Android:layout _ height= wrap _ content
android:layout_marginTop=30dp
安卓:方向=水平
图片
Android:layout _ width= wrap _ content
Android:layout _ height= wrap _ content
Android:background= @ color/black
android:src=@mipmap/ic_back /
图片
Android:layout _ width= wrap _ content
Android:layout _ height= wrap _ content
android:background=@color/red
android:src=@mipmap/ic_back
app:tint=@color/black /
/线性布局在appcompat的高版本中已经改用应用程序:色调代替。
代码方式修改色调:
m绑定。imageview。图像色调列表=上下文兼容性。getcolorstatelist(this,R.color.greenPrimary)除了色彩还有背景色调,效果同理。
使用场景除了上面的示例外,还可以在点赞、收藏这类场景的显示上使用。
android:dividerLinearLayout也是我们使用非常高频的一个布局,下面介绍两个个少为人知的属性。
相信很多人都用视角写过分割线的效果,类似这样:
文本视图/
视角
Android:layout _ width= match _ parent
android:layout_height=1dp
android:background=#EEEEEE /
文本视图/如上,当有多个带边框的之间需要添加分割线的时候,就只能一个一个复制,复制其实也没什么,就是代码看起来不优雅。
其实有个比较优雅的办法,线性布局可以通过安卓:分割线属性添加分割线,结合安卓:显示分割线属性即可达到效果。
xml:
线性布局
Android:layout _ width= match _ parent
Android:layout _ height= wrap _ content
android:layout_margin=20dp
Android:background= @ drawable/shape _ radius 5 _ white
Android:divider= @ drawable/shape _ divider _ linear
安卓:方向=垂直
android:showDividers=middle
带边框的
android:text=删除个人信息
app:drawableStartCompat= @ MIP map/IC _ helper /
带边框的
android:text=注销账户
app:drawableStartCompat= @ MIP map/IC _ helper /
带边框的
android:id=@ id/tv_about
android:text=关于我们
app:drawableStartCompat= @ MIP map/IC _ helper /
/线条布局形状_分隔线_线性是分割线的样式:
?可扩展标记语言版本=1.0 编码=utf-8 ?
层列表xmlns:Android= http://模式。安卓。 com/apk/RES/Android
项目
android:left=50dp
形状机器人:形状=矩形
坚固的android:color=#F6F6F6 /
尺寸android:height=1dp /
/形状
/项目
/层列表效果:
showDividers有四个选项:
中间每两个组件间显示分隔线开始开始处显示分隔线目标结尾处显示分隔线没有人不显示其实举一反三,除了分割线,查看之间的间隔也可以这么实现,省得每个子视角都要写保证金。
Android:AnimatelayoutChanges AnimatelayoutChanges属性在ViewGroup中,主要是在添加和删除子视图时,默认添加300ms的渐变动画。
代码:
Android:animatelayoutchanges= true 效果:
默认添加删除比较生硬,添加动画后体验会好很多。
当然,如果你愿意,也可以修改默认动画。怎么修改?没有什么比学习源代码更直接的了。
源代码:
case r . styleable . view group _ animate layout changes:
boolean animateLayoutChanges=a . get boolean(attr,false);
if (animateLayoutChanges) {
setLayoutTransition(new layout transition());
}
打破;当animateLayoutChanges的属性值为true时,将调用setLayoutTransition方法并传入一个默认的LayoutTransition对象。
LayoutTransition对象用于构造动画,类似于一般动画。有兴趣的可以看看官方文档或者跟着源码看。
自定义LayoutTransition对象后,调用view group . setlayouttransition(layout transition)。
android:前景
android:foreground=?Android:attr/selectableitembutterbackground Android 5.0以后,添加这个属性查看后,点击时会默认有水波纹效果。一般来说,可点击的视图默认有这种效果,比如Button。通常,该属性通常添加到自定义项目视图中,以改善用户体验。
最后,本文介绍了在编写xml的日常过程中可以提高效率和性能的17个属性。如果有什么想法,欢迎评论补充。
如果这篇文章对你有帮助,谢谢支持~
版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。