项目作者: xechoz

项目描述 :
改进版的 ViewStub
高级语言: Kotlin
项目地址: git://github.com/xechoz/OkViewStub.git
创建时间: 2020-07-25T18:47:39Z
项目社区:https://github.com/xechoz/OkViewStub

开源协议:GNU General Public License v3.0

下载


About OkViewStub

主要是改进ViewStub 的使用体验问题

  1. xml 设置 内容. 可指定 layout 或者 view class
  2. 代码 inflate. 可inflate xml 内容 或者 直接设置 view
  3. 支持 Android Studio 预览

ViewStub 的问题:

使用不够方便。

  1. 只能使用 xml 引用layout xml,不能直接使用 class,类似 fragment 的 class=”a.b.c”.

    实际上,需要填充的内容很可能是一个View 控件,如果要用 ViewStub, 就得使用一个 layout.xml 指向这个 View 类型,实在是多余。

  2. 不能用代码设置view

实际开发,每个模块的接口更多的是返回一个 View,例如 DemoView, 而不是一个 layout.xml, 这时就无法使用 ViewStub,但是我又想按需设置View,通常只有两个做法:

  1. 使用 Layout 占位。
    例如 FrameLayout 代替 ViewStub, 直接 addView(demoView);
    代价是xml 布局多了一个 层级 或者多了一个没用到的 FrameLayout

  2. 用代码设置
    parent.addView(demoView), setLayoutParams, setMargin, setPadding, setBackground ...
    代价是代码写布局, 可读性太差,一定会被同事吐槽

所改进版的ViewStub 需要改进的功能就很明确了。

改进方案: OkViewStub

  1. xml 设置 内容. 可指定 layout 或者 view class
  2. 代码 inflate. 可inflate xml 内容 或者 直接设置 view
  3. 支持 Android Studio 预览
  1. <xyz.icodes.widget.OkViewStub
  2. android:id="@+id/stubA"
  3. android:layout_width="200dp"
  4. android:layout_height="64dp"
  5. android:layout_gravity="center"
  6. app:layout="@layout/demo"
  7. app:layout_class="com.example.myapplication.DemoView"
  8. ></xyz.icodes.widget.OkViewStub>
  1. 1. app:layout 或者 app:layout_class 二选一,指定内容。或者不指定,用代码设置 viewStub.inflate(view)
  2. 2. viewstub.inflate() 或者 xml 不指定view,用代码设置 viewStub.inflate(your view)
  3. 3. 其他:
  4. OkViewStub.isflated 查询是否设置过内容
  5. OkViewStub.contentView 当前内容View

Demo Code

  1. set view layout or class on xml
  1. <!-- use layout -->
  2. <xyz.icodes.widget.OkViewStub
  3. android:id="@+id/stubA"
  4. android:layout_width="200dp"
  5. android:layout_height="64dp"
  6. app:layout="@layout/demo" ></xyz.icodes.widget.OkViewStub>
  7. <!-- use android build in view -->
  8. <xyz.icodes.widget.OkViewStub
  9. android:id="@+id/stubB"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. app:layout_class="SearchView" ></xyz.icodes.widget.OkViewStub>
  13. <!-- use custom view-->
  14. <xyz.icodes.widget.OkViewStub
  15. android:id="@+id/stubC"
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. app:layout_class="com.example.myapplication.DemoView" ></xyz.icodes.widget.OkViewStub>
  19. <!-- inflate by code -->
  20. <xyz.icodes.widget.OkViewStub
  21. android:id="@+id/stubD"
  22. android:layout_width="100dp"
  23. android:layout_height="100dp" ></xyz.icodes.widget.OkViewStub>
  1. inflate content
  1. stubA.inflate()
  2. stubB.inflate()
  3. stubC.inflate()
  4. // first content view
  5. var image = ImageView(this)
  6. image.setImageResource(R.mipmap.ic_launcher_round)
  7. stubD.inflate(image)
  8. image.postDelayed({
  9. // we can replace content view multiple times
  10. image = ImageView(this)
  11. image.setBackgroundResource(R.drawable.ic_launcher_background)
  12. image.setImageResource(R.drawable.ic_launcher_foreground)
  13. stubD.inflate(image)
  14. }, 2000)

参考