美文网首页Android开发android开发技巧
再见 findViewById,你好 View Binding

再见 findViewById,你好 View Binding

作者: Tyhoo_Wu | 来源:发表于2020-02-26 22:25 被阅读0次

版权声明:本文为博主原创文章,未经博主允许不得转载。
https://www.jianshu.com/p/ccb0d850577b

前言:北京时间2020年2月26日,Android Studio 正式版迎来了版本更新 Version 3.6。

访问视图的方法 简明 编译安全 编译速度
findViewById \color{red}{No} \color{red}{No} Yes
Databinding Yes Yes \color{red}{No}
Butter Knife Yes \color{red}{No} \color{red}{No}
Kotlin Synthetic Yes \color{red}{No} Yes
??? Yes Yes Yes

在简明、编译安全和编译速度上都各有优势,那么有没有一个三合一的方法呢?在今天(2020年2月26日)我们可以正式使用这个方法 —— View Binding

官方文档:https://developer.android.google.cn/topic/libraries/view-binding

首先将 Android Studio 更新到 3.6 正式版

之后在 build.gradle 里开启 View Binding(和 Databinding 相似)

android {
    ...
    viewBinding {
        enabled = true
    }
}

使用 View Binding 在 Activity 和 Fragment 里是有区别的,所以分开讲解。

Java 写法,在 Activity 里使用 View Binding

1.自定义布局

<TextView android:id="@+id/text_view_activity_java" />

2.在 Activity 里绑定布局

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding mActivityBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mActivityBinding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = mActivityBinding.getRoot();
        setContentView(view);
    }
}

3.给控件设置内容

mActivityBinding.textViewActivityJava.setText("View Binding Java Activity.");

Java 写法,在 Fragment 里使用 View Binding

1.自定义布局

<TextView android:id="@+id/text_view_fragment_java" />

2.在 Fragment 里绑定布局

public class MainFragment extends Fragment {

    private FragmentMainBinding mFragmentBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        mFragmentBinding = FragmentMainBinding.inflate(inflater, container, false);
        View view = mFragmentBinding.getRoot();
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();

        mFragmentBinding = null;
    }
}

注:一定要在 onDestroyView 的时候清除对绑定实例的所有引用

3.给控件设置内容

mFragmentBinding.textViewFragmentJava.setText("View Binding Java Fragment.");

Kotlin 写法,在 Activity 里使用 View Binding

1.自定义布局

<TextView android:id="@+id/text_view_activity_kotlin" />

2.在 Activity 里绑定布局

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding = ActivityMainBinding.inflate(layoutInflater)
        val view = mBinding.root
        setContentView(view)
    }
}

3.给控件设置内容

mBinding.textViewActivityKotlin.text = "View Binding Kotlin Activity."

Kotlin 写法,在 Fragment 里使用 View Binding

1.自定义布局

<TextView android:id="@+id/text_view_fragment_kotlin" />

2.在 Fragment 里绑定布局

class MainFragment : Fragment() {

    private var _binding: FragmentMainBinding? = null

    private val mBinding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentMainBinding.inflate(inflater, container, false)
        val view = mBinding.root
        return view
    }

    override fun onDestroyView() {
        super.onDestroyView()

        _binding = null
    }
}

3.给控件设置内容

mBinding.textViewFragmentKotlin.text = "View Binding Kotlin Fragment"



与 findViewById 的区别
与使用 findViewById 相比,视图绑定具有一些很显著的优点:
空安全、类型安全。

与 Databinding 的区别
Databinding 仅处理使用 <layout> 代码创建的数据绑定布局。
View Binding 不支持布局变量或布局表达式,因此它不能用于在 XML 中将布局与数据绑定。

相关文章

网友评论

    本文标题:再见 findViewById,你好 View Binding

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