Android如何按需加载自定义View?XML方式是否可行?
通过XML实现自定义View的按需加载方案
完全可以用ViewStub实现自定义View的XML按需加载,你之前的误解是没掌握正确用法——把自定义View封装到单独布局里,通过ViewStub加载后就能获取实例并访问属性,具体步骤如下:
第一步:将FooView单独封装到一个布局文件中
新建layout_foo_view.xml,内容仅包含你的自定义View,还能直接在XML里配置它的自定义属性:<?xml version="1.0" encoding="utf-8"?> <com.yourpackage.FooView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/foo_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:customAttr="default_value" />第二步:在fragment_login.xml中用ViewStub引用该布局
把原来直接写FooView的位置换成ViewStub,指定它要加载的布局为上面的layout_foo_view.xml:<ViewStub android:id="@+id/foo_view_stub" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout="@layout/layout_foo_view" />第三步:在代码中按需初始化并获取FooView实例
当需要使用FooView时,调用ViewStub的inflate()方法,强转成FooView后就能直接操作它的属性和方法:// Kotlin示例 val fooStub = view.findViewById<ViewStub>(R.id.foo_view_stub) val fooView = fooStub.inflate() as FooView // 访问自定义属性或调用方法 fooView.customText = "按需加载完成" fooView.doSomething()// Java示例 ViewStub fooStub = view.findViewById(R.id.foo_view_stub); FooView fooView = (FooView) fooStub.inflate(); fooView.setCustomText("按需加载完成"); fooView.doSomething();
补充说明
- 一旦调用
inflate(),ViewStub会被替换成目标布局里的FooView,后续再调用会直接返回已经初始化好的实例,不用担心重复初始化。 - 如果需要动态调整FooView的布局参数或自定义属性,也可以在inflate之后通过实例直接修改,和直接在XML里写FooView的使用方式完全一致。
内容的提问来源于stack exchange,提问作者William Hu
相关产品推荐
相关产品推荐

