视图绑定

作者: 和莱 | 来源:发表于2021-02-02 11:51 被阅读0次

    ● What
    通过视图绑定,可以更好的编写与视图进行交互的代码。在模块中启用视图绑定以后,系统会为模块中的每一个布局资源文件生成对应的绑定类,类名是布局资源文件名的驼峰大小写,并在末尾添加Binding,比如一个布局文件名是main_activity.xml,那么生成的绑定类叫做MainActivityBinding。通过这个类的实例,可以获得根视图和具有id属性的控件的引用,从而对视图进行相应的操作。

    ● How
    首先需要在对应的模块下的build.gradle文件中添加如下声明,sync以后就启用视图绑定了。
    viewBinding {
    enabled = true
    }
    在Activity中的onCreate()方法中调用布局绑定类的inflate()方法的到布局绑定类的实例,然后根据这个实例使用getRoot()方法得到根布局,然后使用setContentView()方法将根视图设置为活动视图,根据子view的id得到对应的view的引用。
    public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding mActivityMainBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());//获得布局绑定类的实例
    LinearLayout linearLayout = mActivityMainBinding.getRoot();//根视图的引用
    mActivityMainBinding.name.setText("Tom");//操作子view
    mActivityMainBinding.button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
    }
    });
    setContentView(linearLayout);//将根视图设置为活动视图
    }
    }
    如果是在Fragment中使用视图绑定,首先调用生成的绑定类的静态方法inflate()创建绑定类的实例,然后通过getRoot()方法得到根视图,返回根视图使其成为活动视图。
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
    @Nullable Bundle savedInstanceState) {
    mFragmentFirstBinding = FragmentFirstBinding.inflate(inflater,container,false);
    LinearLayout linearLayout = mFragmentFirstBinding.getRoot();
    TextView textView = mFragmentFirstBinding.firstTextView;
    textView.setText("Fragment");
    return linearLayout;
    }
    Why not findViewById()
    由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable标记;每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。这些差异意味着布局和代码之间的不兼容将会导致构建在编译时(而非运行时)失败。

    相关文章

      网友评论

        本文标题:视图绑定

        本文链接:https://www.haomeiwen.com/subject/ndfytltx.html