美文网首页Android 进阶之旅
Android 进阶学习(三十三) Android 中一些常用的

Android 进阶学习(三十三) Android 中一些常用的

作者: Tsm_2020 | 来源:发表于2022-10-10 11:45 被阅读0次

很久没有写文章了,并不是停止了学习的脚步,而是觉得最近学习的内容比较琐碎,就是学习的东西很多都是官方给的一些api,简单的使用介绍写起来太枯燥无味了,而且没有深度写起来也没有动力.那今天就来看看一些简单但是非常实用的开发技巧,有些是我从开源框架中学到的,有些是平时积累的,今天就来归纳一下

1.1RecyclerView 预览
image.png

RecyclerView 可以在预览界面显示出来你想要的大致效果,同时也可以在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.png
1.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 的过程有关,具体的还需要研究一下,

相关文章

网友评论

    本文标题:Android 进阶学习(三十三) Android 中一些常用的

    本文链接:https://www.haomeiwen.com/subject/gsjjgrtx.html