很久没有写文章了,并不是停止了学习的脚步,而是觉得最近学习的内容比较琐碎,就是学习的东西很多都是官方给的一些api,简单的使用介绍写起来太枯燥无味了,而且没有深度写起来也没有动力.那今天就来看看一些简单但是非常实用的开发技巧,有些是我从开源框架中学到的,有些是平时积累的,今天就来归纳一下
1.1RecyclerView 预览
image.pngRecyclerView 可以在预览界面显示出来你想要的大致效果,同时也可以在xml中直接设置layoutmanager 并指定orientation ,减少activity 中代码量,来达到控制水平滑动还是垂直滑动,这样做非常方便调试,找文件真是太方便了,同样spanCount 也可以设置,
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:orientation="vertical"
tools:listitem="@layout/item_simple_test"
tools:itemCount="10"/>
1.2 预览xml报错
c89ce2c3d7092bf8b13c768a90b815e.jpg如果一个xml文件出现了一个view 由于使用了类似application 这种启动才初始化的这种变量,就会导致整个布局都没有办法预览,这个问题google 也考虑到了,
public boolean isInEditMode() {
return false;
}
View 有一个editmode ,在预览的时候返回true ,实际运行的时候返回false,把影响展示效果的代码放在由editmode 控制的代码块里面就可以了,来一个简单的例子
abstract class ZHomeConstraintLayout : ConstraintLayout {
constructor(context: Context) : super(context) {
initViews(context, null)
if(!isInEditMode){
initViewData()
}
}
}
在协同开发的过程中还会出现另一种情况,那就是你自己绘制了一个view , 但是这个View 可能是别人用,你就要尽可能的将所有变量都设置成属性,但是想要将View 展示出来就需要添加一些网络请求回来的数据,这样就导致你虽然封装了很多属性,但是在使用xml调整布局的时候写布局的人是感知不到的,他又没有数据,editmode 同样可以解决这个痛点
class AweApplyTranslationView : View {
....省略代码
private fun initViews(context: Context, attributeSet: AttributeSet?) {
mPaint = Paint()
mPaint.isAntiAlias = true
mPaint.style = Paint.Style.FILL
mTextPaint = TextPaint()
mTextPaint.isAntiAlias = true
mTextPaint.textAlign = Paint.Align.LEFT
attributeSet?.apply {
var type = context.obtainStyledAttributes(attributeSet, R.styleable.AweApplyTranslationView)
}
///预览添加测试数据
if(isInEditMode){
var point1= AweTranApplyBean()
point1.startScroll=1500f
point1.mTitle="预览标题"
point1.mDesc="仅供预览"
point1.mTop=100f
mPointList.add(point1)
}
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.apply {
if(BuildConfig.DEBUG){
mTextPaint.textSize = mTitleTextSize
canvas?.drawText("滑动距离$mRealScroll", width / 2 * 1f, 400f, mTextPaint)
}
if (mPointList.isEmpty()) {
return
}
....省略代码
}
}
}
如果是预览的情况,自己添加进去测试数据,这样在xml预览的过程中就会看到所有配置属性的效果了
image.png
1.3 tools 标签使用
大家的编写xml布局的过程中经常会遇到一种情况就是某些特定的view需要在特定的情况下才展示,这就导致一个xml文件写的满满当当的,但是实际预览的情况下有啥也没有,自己改这个文件还好,其他人在修改的过程中看逻辑找View都不好找,明显增加了工作量
android:visibility="gone"
tools:visibility="visible"
就多了一行代码,但是整个布局所有view 的分布在xml中看得都非常清楚,简单了不少
还有在修改TextView 的textColor 这个属性,如果textView 没有内容,修改后台颜色也是看不到的,
tools:text="标题"
tools的应用场景非常多,而且也没有使用门槛,只不过就是大家没有发现他的好处,而且协同开发的时候,一个人用,一个人不用,也会造成一些不必要的困扰,至于到底用不用,就需要大家考虑一下维护成本了
1.4 showIn tools 相关
include 是大家在开发过程中进场使用的标签, 但是如果能在子标签中查看添加在父标签中的效果,那就太好了showin 这个属性就可以帮助我们完成这个操作,而且使用还非常简单
image.png子文件写法
image.png
tools 自动将这两个文件做了关联,非常方便
1.5 parentTag tools相关
项目中肯定非常多控件封装,但是在封装过程中有一个非常小的细节,那就是我们写的布局 如果使用merge 标签,在使用 封装的ViewGroup 将 这个xml文件add 进去,这样就减少了布局嵌套,还能达到同样的效果,举个栗子
abstract class ZHomeConstraintLayout : ConstraintLayout {
fun initViews(context: Context, attributeSet: AttributeSet?) {
this.mContext=context
LayoutInflater.from(context).inflate(getLayoutId(),this,true)
}
}
xml 文件内容
<?xml version="1.0" encoding="utf-8"?>
<merge 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="wrap_content"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
>
</merge>
这种写法可以减少布局嵌套,但是在使用merge时,我们由于不知道父布局是什么view ,就导致预览的时候有问题,这时tools:parentTag 就可以帮助我们指定父布局的类型,来达到我们理想中的预览情况
image.png1.6 animateLayoutChanges
<LinearLayout
android:id="@+id/ll_zhome_view_anim_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:gravity="center_horizontal"
android:background="@color/blue"
android:orientation="vertical"/>
动画.gif
ViewGroup 的一个属性,测试了一下LiearLayout 和ConstraintLayout 效果都非常好,但是他有一个缺陷,
在配合属性动画的时候,由于属性动画只是改变了显示位置,并没有改变view 的实际位置, 执行完属性滑动后,隐藏再显示的View 的点击事件没有了,应该是与layout 的过程有关,具体的还需要研究一下,
网友评论