ViewBinding的使用(一)

~个人记录与学习使用~

一:基本配置和注意事项

  • AndroidStudio至少要升级到3.6
  • 项目配置的Android gradle plugin version 必须大于等于3.6.0
    也就是在project下的build.gradle文件中,classpath “com.android.tools.build:gradle:3.6.0” 的版本最低要为3.6.0
  • 在对应模块的build.gradle 下加入如下配置
android {
	...
	buildFeatures {
    	viewBinding true
	}
	...
}
  • 有的低版本配置方式不同(和Android gradle plugin version 有关)
android {
	...
	viewBinding.enabled = true
	...
}
  • viewbinding会在 {modelName}/build/generated/data_binding_base_class_source_out/debug/out/{packageName}/databinding 下生成一个一个的binding文件,名称**{bindingFileName}.java**,名称和创建的layout的资源名有关。
    11111
  • 生成的文件代码例子如下:
public final class ActivityViewBindingTestBinding implements ViewBinding {
  @NonNull
  private final ConstraintLayout rootView;

  private ActivityViewBindingTestBinding(@NonNull ConstraintLayout rootView) {
    this.rootView = rootView;
  }

  @Override
  @NonNull
  public ConstraintLayout getRoot() {
    return rootView;
  }

  @NonNull
  public static ActivityViewBindingTestBinding inflate(@NonNull LayoutInflater inflater) {
    return inflate(inflater, null, false);
  }

  @NonNull
  public static ActivityViewBindingTestBinding inflate(@NonNull LayoutInflater inflater,
      @Nullable ViewGroup parent, boolean attachToParent) {
    View root = inflater.inflate(R.layout.activity_view_binding_test, parent, false);
    if (attachToParent) {
      parent.addView(root);
    }
    return bind(root);
  }

  @NonNull
  public static ActivityViewBindingTestBinding bind(@NonNull View rootView) {
    if (rootView == null) {
      throw new NullPointerException("rootView");
    }

    return new ActivityViewBindingTestBinding((ConstraintLayout) rootView);
  }
}

二:简单使用

kotlin版本

  • Activity中使用:
class ViewBindingTestActivity : AppCompatActivity() {
    private val vb: ActivityViewBindingTestBinding by lazy {
        ActivityViewBindingTestBinding.inflate(
            layoutInflater
        )
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(vb.root)
    }
}
  • Framgent中使用
class ViewBindingTestFragment : Fragment() {
	//注意 _binding 和 binding,因为需要在 onDestroyView 进行释放,以免内存泄漏,所以设计这样
    private var _binding: FragmentViewBindingTestBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        _binding = FragmentViewBindingTestBinding.inflate(layoutInflater, container, false)

        binding.tv.text = "测试一下ViewBinding"
        return binding.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
  • Include使用(一)、给include布局设置id
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
    android:orientation="vertical"
    tools:context=".viewbinding.ViewBindingTestActivity">

    <fragment
        android:id="@+id/fragmentTest"
        android:name="com.example.cmlayoutlearn.viewbinding.ViewBindingTestFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <include 
    	android:id="@+id/includeItem"
    	layout="@layout/include_item_layout" />


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rcv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:itemCount="3"
        tools:listitem="@layout/item_vb_test_view" />

</LinearLayout>
class ViewBindingTestActivity : AppCompatActivity() {
    private val vb: ActivityViewBindingTestBinding by lazy {
        ActivityViewBindingTestBinding.inflate(
            layoutInflater
        )
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(vb.root)
         vb.includeItem.tvContent.text = "内容设置"

        val arrayList = ArrayList<String>()
        for (i in 0..30) {
            arrayList.add("i   =  $i")
        }

        vb.rcv.layoutManager = LinearLayoutManager(this)
        vb.rcv.adapter = VbRcvAdapter(arrayList)
    }
}
  • Include使用(二)、给include布局内设置 /merge/> 标签,然后bind父布局,可以不设置id了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
    android:orientation="vertical"
    tools:context=".viewbinding.ViewBindingTestActivity">


    <fragment
        android:id="@+id/fragmentTest"
        android:name="com.example.cmlayoutlearn.viewbinding.ViewBindingTestFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <include layout="@layout/include_item_layout" />


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rcv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:itemCount="3"
        tools:listitem="@layout/item_vb_test_view" />

</LinearLayout>
class ViewBindingTestActivity : AppCompatActivity() {
    private val vb: ActivityViewBindingTestBinding by lazy {
        ActivityViewBindingTestBinding.inflate(
            layoutInflater
        )
    }

    private val vbInclude: IncludeItemLayoutBinding by lazy {
        IncludeItemLayoutBinding.bind(vb.root)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(vb.root)
        //        vb.includeItem.tvContent.text = "内容设置"
        vbInclude.tvContent.text = "内容设置"
        val arrayList = ArrayList<String>()
        for (i in 0..30) {
            arrayList.add("i   =  $i")
        }

        vb.rcv.layoutManager = LinearLayoutManager(this)
        vb.rcv.adapter = VbRcvAdapter(arrayList)
    }
}
  • RecyclyView的ViewHolder使用
class VbRcvAdapter(private val dataList: ArrayList<String>) :
    RecyclerView.Adapter<VbTestViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VbTestViewHolder {
        val vb = ItemVbTestViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return VbTestViewHolder(vb)

    }

    override fun onBindViewHolder(holder: VbTestViewHolder, position: Int) {
        holder.bindDataToView(dataList[position])
    }

    override fun getItemCount(): Int = dataList.size
}

class VbTestViewHolder(val vb: ItemVbTestViewBinding) : RecyclerView.ViewHolder(vb.root) {

    fun bindDataToView(str: String) {
        vb.tv.text = str
        //...
    }
}
  • 自定义View
class VbCustomViewTest @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {

    private val vb: ItemRcvBinding by lazy {
        ItemRcvBinding.inflate( //必须用三个参数的方法(最外层使用merge,则为两个)
            LayoutInflater.from(context),
            this,
            true //必须为true,如果最外层使用merge,则此参数不再使用(编译器会提醒)
        )
    }

    init {
        renderView(context)
    }

    private fun renderView(context: Context) {
        vb.tvTitle.text = "1111111"
    }

    fun setTitle(string: String){
        vb.tvTitle.text = string
    }

Java版本

  • Activity中使用:
public class VbJavaTestActivity extends AppCompatActivity {
    private ActivityVbJavaTestBinding vb;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        vb = ActivityVbJavaTestBinding.inflate(getLayoutInflater());
        setContentView(vb.getRoot());
        vb.tv.setText("测试一下");
    }
}
  • Framgent中使用
public class VbJavaTestFragment extends Fragment {
    private FragmentVbJavaTestBinding vb;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        vb = FragmentVbJavaTestBinding.inflate(inflater, container, false);
        return vb.getRoot();
    }
    
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        vb = null;
    }
}

后续补充…

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值