View Binding

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);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值