方便自己后面的深入学习记录一下使用,viewbinding 使用必须在Androidstudio3.6版本上支持。官网:https://developer.android.google.cn/topic/libraries/view-binding#kotlin
1.启用视图绑定,在项目添加:
android {
...
viewBinding {
enabled = true
}
}
注意:如果您希望在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore="true"
属性添加到相应布局文件的根视图中,为某个模块启用视图绑定功能后,系统会为该模块中包含的每个 XML 布局文件生成一个绑定类。每个绑定类均包含对根视图以及具有 ID 的所有视图的引用。系统会通过以下方式生成绑定类的名称:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。每个绑定类还包含一个 getRoot()
方法,用于为相应布局文件的根视图提供直接引用
2.在各个引用布局添加绑定(当xml布局 使用了<include />控件,比较添加id,来调用):
Activity(onCreate()方法使用):
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
fragment ( onCreateView() 方法使用 )
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
另一种写法(onViewCreated())
/**
* View Binding example with a fragment that uses the alternate constructor for inflation and
* [onViewCreated] for binding.
*/
class BindFragment : Fragment(R.layout.fragment_blank) {
// Scoped to the lifecycle of the fragment's view (between onCreateView and onDestroyView)
private var fragmentBlankBinding: FragmentBlankBinding? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = FragmentBlankBinding.bind(view)
fragmentBlankBinding = binding
//使用
binding.textViewFragment.text = getString(string.hello_from_vb_bindfragment)
}
override fun onDestroyView() {
// Consider not storing the binding instance in a field, if not needed.
fragmentBlankBinding = null
super.onDestroyView()
}
}
dialog(参考):
mBinding = DialogDemoBinding.inflate(layoutInflater);
setContentView(mBinding.getRoot());
adapter (参考):
public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.ViewHolder> {
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(ItemDemoBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.binding.textView2.setText("demo");
}
@Override
public int getItemCount() {
return 0;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
ItemDemoBinding binding;
public ViewHolder(@NonNull ItemDemoBinding itemDemoBinding) {
super(itemDemoBinding.getRoot());
this.binding = itemDemoBinding;
}
}
}
这里感谢这位大佬的文章分享,引用参考
https://www.jianshu.com/p/66728b95baaa
还有activity和fragment的封装 参考:
public class BaseActivity<T extends ViewBinding> extends AppCompatActivity {
protected T viewBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
Class cls = (Class) type.getActualTypeArguments()[0];
try {
Method inflate = cls.getDeclaredMethod("inflate", LayoutInflater.class);
viewBinding = (T) inflate.invoke(null, getLayoutInflater());
setContentView(viewBinding.getRoot());
} catch (NoSuchMethodException | IllegalAccessException| InvocationTargetException e) {
e.printStackTrace();
}
}
}
//使用
public class MainActivity extends BaseActivity<ActivityMainBinding> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewBinding.button.setText("这是 MainActivity ViewBinding");
viewBinding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("MainView","点击按钮");
}
});
}
}
public class BaseFragment<T extends ViewBinding> extends Fragment {
protected T viewBinding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
Class cls = (Class) type.getActualTypeArguments()[0];
try {
Method inflate = cls.getDeclaredMethod("inflate", LayoutInflater.class, ViewGroup.class, boolean.class);
viewBinding = (T) inflate.invoke(null, inflater, container, false);
} catch (NoSuchMethodException | IllegalAccessException| InvocationTargetException e) {
e.printStackTrace();
}
return viewBinding.getRoot();
}
}
//使用
public class MainFragment extends BaseFragment<FragmentMainBinding>{
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewBinding.button.setText("这是 MainFragment ViewBinding");
viewBinding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("MainView","点击按钮");
}
});
}
}