美文网首页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