前言
之前的ViewBinding对include很不友好,以至于用起来很是难受,到目前优化后不再强制转换FrameLayout布局,使用更加舒适。
解决
用之前的例子,直接上代码,这次我们给include的xml加上id:
<!--布局 fragment_tab_me-->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!--引入布局 include_mine_head_layout-->
<include
android:id="@+id/include_head"
layout="@layout/include_mine_head_layout" />
</LinearLayout>
- 使用外部类.内部类获取控件引用值
private lateinit val mLayout: FragmentTabMeBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
mLayout = FragmentTabMeBinding.inflate(inflater,container,false)
return mLayout.root
}
private fun init() {
/* ViewBinding会给嵌入的include自动inflate成另一个bind类,直接用内部类引用
* 源码如下,可以在app/build/generated/ap_generated_sources/data_binding_base_class_source_out/debug/out/包名/databing/ 找到具体的bind类(后面有附图) :
*
@NonNull
public final IncludeHeadBinding includeHeadBinding;
View includeHead = rootView.findViewById(include_head);
if (includeHead == null) {
missingId = "includeHead";
break missingId;
}
IncludeHeadBinding includeHeadBinding = IncludeHeadBinding(includeHead);
*/
mLayout.includeHead.name.text = "xxx"
}
- include重新赋值
private lateinit val mLayout: FragmentTabMeBinding
private lateinit val mLayout: IncludeMineHeadLayoutBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
mLayout = FragmentTabMeBinding.inflate(inflater,container,false)
// ViewBinding会给嵌入的include自动inflate成一个View,所以我们可以直接重新赋值
mHeadLayout = mLayout.includeHead
return mLayout.root
}
private fun init() {
mHeadLayout.name.text = "xxx" // 因为上面的赋值生效,所以这里是有效的
}
我个人比较喜欢用第二种方式,如果命名较长的话,第一种方式用起来特别麻烦,第二种会更方便,但缺点是会多存储一个对象。