Android 开发小技巧记录

569 阅读2分钟

设置View的最大高度

直接使用maxHeight属性没效果,可以通过ConstraintLayout的layout_constraintHeight_max约束来实现:

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/rvConstraintLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@id/ivCard">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginHorizontal="@dimen/dp20"
        android:nestedScrollingEnabled="false"
        android:paddingBottom="@dimen/dp12"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_default="wrap"
        app:layout_constraintHeight_max="@dimen/dp300"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

clipToPadding 属性

默认为true,默认子布局不能在padding区域绘制。设置父布局的clipToPadding="false",当子布局在向上移动的过程中,其可以在padding区域绘制了。 为什么一开始没绘制在padding区域,而滑动的时候可以绘制呢?

clipToPadding 原理

当clipToPadding == true时,子布局的Canvas会被父布局裁减,而裁减的尺寸即为padding的距离(此处忽略scroll距离)。

初始绘制:子布局就不能在padding里绘制的。

滑动绘制:Canvas虽然被限制了尺寸,但是还可以移动Canvas。当子布局进行滑动的时候,设置了clipToPadding==false,父布局不会对子布局的Canvas进行裁减,由于不进行裁减,所以可以显示(在父布局范围内,若是超出父布局,就涉及到ClipChildren属性了)。

当父布局设置了padding,而又想子布局在滑动的时候可以无视padding,通过设置clipToPadding 属性,来满足在padding区域绘制。

使用场景:clipToPadding 在RecyclerView里的运用

RecyclerView滑动

  • 滑到某个位置
binding.rv.apply {
    postDelayed({ smoothScrollToPosition(this@InfoFragment.adapter.size() - 1) }, 60)
}

NestedScrollView滑到某个view底部

binding.scrollLayout.postDelayed({
    binding.scrollLayout.smoothScrollTo(
        0,binding.feedbackView.bottom
    )
}, 60)

android APP 桌面icon消失不见

androidManifest中,<intent_filter>里的category设置重复导致,是由于同一个intent-filter设置了多个category的原因,解决方法,分两个intent-filter即可。

image.png