View Binding是Android Studio 3.6推出的新特性,为了替换findViewById,其内部实现还是使用findViewById。在启动视图绑定后(模块gradle中配置),系统会为该模块中的每个xml文件生成一个绑定类,绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用,也可以设置某个xml文件不生成绑定类。
1、启动视图绑定
android{
buildFeatures { viewBinding = true }
}
2、忽略某个xml文件,不自动生成绑定类
布局文件的根视图中添加 tools:viewBindingIgnore="true"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:viewBindingIgnore="true"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_user_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="手机号"
android:inputType="number"
android:text="13200002006" />
</LinearLayout>
3、使用绑定类
启动视图绑定后,系统会为该模块每个xml文件自动生成一个绑定类,忽略的除外,类名是以xml布局文件名去掉下换线后,单词首字母大写加上Binding。activity_main.xml生成的类ActivityMainBinding。
一:activity中
public class MainActivity extends AppCompatActivity { private ActivityMainBinding activityMainBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityMainBinding = ActivityMainBinding.inflate(LayoutInflater.from(this)); setContentView(activityMainBinding.getRoot()); String phoneStr = activityMainBinding.etUserMobile.getText().toString().trim(); activityMainBinding.xxx.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ...... } }); } }
二、fragment中
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { fragmentAppLoginBinding = FragmentAppLoginBinding.inflate(inflater, container, false) return fragmentAppLoginBinding.getRoot(); }
或binding = FragmentMyBinding.inflate(inflater);
三、dialog中
public MyDialog(@NonNull Context context, @StyleRes int themeResId) {
super(context, themeResId);
//原来的写法
view = View.inflate(getContext(), getLayoutId(), null);
//使用ViewBinding的写法
binding = DialogBottomBinding.inflate(getLayoutInflater());
view = binding.getRoot();
setContentView(view);
}
4.使用的layout文件根标签为merge
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</merge>
正确:
private void init20() {
ViewMyLayoutMergeBinding binding = ViewMyLayoutMergeBinding.inflate(LayoutInflater.from(getContext()), this);
}
错误:
//没有效果,可以理解为还没有rootView
private void init21() {
ViewMyLayoutMergeBinding binding = ViewMyLayoutMergeBinding.bind(this);
}