日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android View Binding的使用

發布時間:2024/9/30 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android View Binding的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/120751996
本文出自【趙彥軍的博客】

文章目錄

  • 什么是View Binding
  • 如何啟用View Binding 功能
  • 怎么去使用View Binding
    • Activity 綁定視圖
    • Fragment 綁定視圖
  • 使用View Binding 寫的基類
    • 1、通過反射的方式(這種方式不推薦使用,會有混淆問題)
    • 2、不通過反射的方式
  • RecyclerView ViewHolder 使用

什么是View Binding

View Binding是Android Studio 3.6推出的新特性,目的是為了替代findViewById(內部實現還是使用findViewById)。。在啟動視圖綁定后,系統會為改模塊中的每個xml文件生成一個綁定類,綁定類的實例包含對在相應布局中具有 ID 的所有視圖的直接引用。

View Binding 的優點

  • Null 安全:由于視圖綁定會創建對視圖的直接引用,因此不存在因視圖 ID 無效而引發 Null 指針異常的風險。此外,如果視圖僅出現在布局的某些配置中,則綁定類中包含其引用的字段會使用 @Nullable 標記。
  • 類型安全:每個綁定類中的字段均具有與它們在 XML 文件中引用的視圖相匹配的類型。這意味著不存在發生類轉換異常的風險。

如何啟用View Binding 功能

android {buildFeatures {viewBinding true} }

如果想在生成綁定類時忽略某個布局文件,將 tools:viewBindingIgnore="true" 屬性添加到相應布局文件的根視圖中:

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:viewBindingIgnore="true"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

怎么去使用View Binding

為用視圖綁定功能后,系統會為該模塊中包含的每個 XML 布局文件生成一個綁定類。這個類的類名是以xml布局文件名去掉下換線后,單詞首字母大寫加上Binding命名的。如 activity_main.xml生成的類 ActivityMainBinding.

Activity 綁定視圖

  • 第一步:調用生成的綁定類中包含的靜態 inflate() 方法。此操作會創建該綁定類的實例以供 Activity 使用。

  • 第二步:通過調用 getRoot() 方法或使用 Kotlin 屬性語法獲取對根視圖的引用。

  • 第三步:將根視圖傳遞到 setContentView(),使其成為屏幕上的活動視圖。

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv"android:layout_width="100dp"android:layout_height="100dp"android:background="#77f"android:text="趙彥軍"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

使用:

class MainActivity : AppCompatActivity() {lateinit var binding: ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)//關鍵代碼binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)//獲取控件binding.tv.setOnClickListener {Toast.makeText(this, "hahha", Toast.LENGTH_SHORT).show()}} }

Fragment 綁定視圖

如何在 Fragment 中使用視圖綁定 請在 Fragment 的 onCreateView()方法中執行以下步驟(注意:Fragment 的存在時間比其視圖長。請務必在 Fragment 的 onDestroyView() 方法中清除對綁定類實例的所有引用。)

  • 調用生成的綁定類中包含的靜態 inflate() 方法。此操作會創建該綁定類的實例以供 Fragment 使用。

  • 通過調用 getRoot() 方法或使用 Kotlin 屬性語法獲取對根視圖的引用。

  • 從 onCreateView() 方法返回根視圖,使其成為屏幕上的活動視圖

//fragment_my.xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="40dp"android:text="這是Fragment按鈕"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/textView" /><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="40dp"android:gravity="center"android:text="這是FragmentTextView"app:layout_constraintBottom_toTopOf="@+id/button"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout> public class MyFragment extends Fragment {private FragmentMyBinding binding;public MyFragment() {}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {binding = FragmentMyBinding.inflate(inflater, container, false);return binding.getRoot();}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);binding.textView.setText("這是Fragment");binding.button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d("Fragment", "點擊了按鈕");}});}@Overridepublic void onDestroy() {super.onDestroy();binding = null;}

在onViewCreated中使用View Binding

//在onViewCreated中使用View Binding public class MyFragment extends Fragment {private FragmentMyBinding binding;public MyFragment() {}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_my,container,false);}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);FragmentMyBinding binding = FragmentMyBinding.bind(view);this.binding = binding;binding.textView.setText("這是Fragment");binding.button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d("Fragment", "點擊了按鈕");}});}@Overridepublic void onDestroy() {super.onDestroy();binding = null;}

使用View Binding 寫的基類

1、通過反射的方式(這種方式不推薦使用,會有混淆問題)

Activity 基類設計

//Java public class BaseActivity<T extends ViewBinding> extends AppCompatActivity {protected T viewBinding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();Class cls = (Class) type.getActualTypeArguments()[0];try {Method inflate = cls.getDeclaredMethod("inflate", LayoutInflater.class);viewBinding = (T) inflate.invoke(null, getLayoutInflater());setContentView(viewBinding.getRoot());} catch (NoSuchMethodException | IllegalAccessException| InvocationTargetException e) {e.printStackTrace();}} }//使用public class MainActivity extends BaseActivity<ActivityMainBinding> {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);viewBinding.button.setText("這是 MainActivity ViewBinding");viewBinding.button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d("MainView","點擊按鈕");}});} } //Kotlin open class BaseActivity<T : ViewBinding> : AppCompatActivity() {protected lateinit var binding: Toverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val type = javaClass.genericSuperclass as ParameterizedTypeval aClass = type.actualTypeArguments[0] as Class<*>val method = aClass.getDeclaredMethod("inflate", LayoutInflater::class.java)binding = method.invoke(null, layoutInflater) as TsetContentView(binding.root)} }class MainActivity : BaseActivity<ActivityMainBinding>() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding.textView.text = "這是MainActivity"} }

Fragment 基類設計

//Java public class BaseFragment<T extends ViewBinding> extends Fragment {protected T viewBinding;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();Class cls = (Class) type.getActualTypeArguments()[0];try {Method inflate = cls.getDeclaredMethod("inflate", LayoutInflater.class, ViewGroup.class, boolean.class);viewBinding = (T) inflate.invoke(null, inflater, container, false);} catch (NoSuchMethodException | IllegalAccessException| InvocationTargetException e) {e.printStackTrace();}return viewBinding.getRoot();} }//使用 public class MainFragment extends BaseFragment<FragmentMainBinding>{@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);viewBinding.button.setText("這是 MainFragment ViewBinding");viewBinding.button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d("MainView","點擊按鈕");}});} } //Kotlin open class BaseFragment<T:ViewBinding>:Fragment(){lateinit var binding: Toverride fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {val type = javaClass.genericSuperclass as ParameterizedTypeval aClass = type.actualTypeArguments[0] as Class<*>val method = aClass.getDeclaredMethod("inflate", LayoutInflater::class.java,ViewGroup::class.java,Boolean::class.java)binding = method.invoke(null,layoutInflater,container,false) as Treturn binding.root} }class FirstFragment : BaseFragment<FragmentFirstBinding>() {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)binding.textView.text = "這是FirstFragment"} }

2、不通過反射的方式

Activity 基類設計

abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {private lateinit var _binding: Tprotected val binding get() = _binding;override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)_binding = getViewBinding()setContentView(_binding.root)}protected abstract fun getViewBinding(): T }class MainActivity : BaseActivity<ActivityMainBinding>() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding.textView.text = "這是MainActivity"}override fun getViewBinding() = ActivityMainBinding.inflate(layoutInflater) }

Fragment 基類設計

abstract class BaseFragment<T : ViewBinding> : Fragment() {private lateinit var _binding: Tprotected val binding get() = _binding;override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {_binding = getViewBinding(inflater, container)return _binding.root}protected abstract fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?): T }class FirstFragment : BaseFragment<FragmentFirstBinding>() {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)binding.textView.text = "這是FirstFragment"}override fun getViewBinding(inflater: LayoutInflater,container: ViewGroup?) = FragmentFirstBinding.inflate(inflater, container, false) }

RecyclerView ViewHolder 使用

方式一:

lass MyItemRecyclerViewAdapter(private val values: List<PlaceholderItem> ) : RecyclerView.Adapter<MyItemRecyclerViewAdapter.ViewHolder>() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {return ViewHolder(FragmentItemBinding.inflate(LayoutInflater.from(parent.context),parent,false))}override fun onBindViewHolder(holder: ViewHolder, position: Int) {val item = values[position]holder.idView.text = item.idholder.contentView.text = item.content}override fun getItemCount(): Int = values.sizeclass ViewHolder(binding: FragmentItemBinding) : RecyclerView.ViewHolder(binding.root) {val idView: TextView = binding.itemNumberval contentView: TextView = binding.content}}

方式二:

class MyItemRecyclerViewAdapter(private val values: List<PlaceholderItem> ) : RecyclerView.Adapter<MyItemRecyclerViewAdapter.ViewHolder>() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {return ViewHolder(FragmentItemBinding.inflate(LayoutInflater.from(parent.context),parent,false))}override fun onBindViewHolder(holder: ViewHolder, position: Int) {val item = values[position]holder.binding.itemNumber.text = item.id}override fun getItemCount(): Int = values.sizeclass ViewHolder(val binding: FragmentItemBinding) : RecyclerView.ViewHolder(binding.root)} 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Android View Binding的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品69久久久久 | 午夜在线观看免费视频 | 在线成人免费观看 | 欧美在线免费看 | 欧美日韩一区二区视频观看 | 亚洲一区二区偷拍 | 黄色视屏软件 | 日韩专区第一页 | 亚洲做受高潮 | 天天舔天天爽 | 性中国xxx极品hd | 精东影业一区二区三区 | 青青草华人在线视频 | 国产三级全黄裸体 | av资源网址 | 日韩黄色一级视频 | 97人妻精品一区二区三区免费 | 国产精品无套 | 干夜夜 | 成人看片 | 天天干天天做天天操 | 在线观看深夜视频 | 国产精品日韩电影 | 亚欧视频在线观看 | av资源部 | 都市激情自拍偷拍 | 欧美.com | 91久久精品在线 | 亚洲xx视频 | 肥臀av | 亚洲天堂一区在线观看 | 九九精品视频免费 | 日日夜夜网 | 手机看片国产精品 | 国产精品扒开腿做爽爽爽a片唱戏 | 一本色道久久88加勒比—综合 | 国产99久久久国产精品免费看 | 强行糟蹋人妻hd中文字幕 | 国产精品久久久一区二区三区 | 69xxx少妇按摩视频 | 欧美 日韩 人妻 高清 中文 | 国产成人综合亚洲 | hs网站在线观看 | 奇米狠狠去啦 | 日本一区二区三区在线观看视频 | 狠狠干导航 | 色综合影视 | 热逼视频 | 国产亚洲欧美在线视频 | 国模少妇一区二区三区 | 香蕉视频国产 | 日韩一区二区免费在线观看 | 精品五月天 | 久久夜色精品国产欧美乱极品 | 成人久久久久久 | 日本熟妇乱子伦xxxx | 国产又黄又猛 | 中国一级特黄毛片大片 | 精品视频久久久久久久 | 成人不卡视频 | 狠狠干少妇 | 女人18岁毛片 | 亚洲精品国产精品国自产观看 | 在线色站 | 亚洲91色 | 美女户外露出 | 日韩在线观看视频一区二区 | av在线手机观看 | 都市激情综合 | 国产精品自拍电影 | 青青草在线播放 | 国产精品自产拍高潮在线观看 | 91网页入口 | 色四月| 孕妇疯狂做爰xxxⅹ 国产精品乱码久久久久久 99久久久成人国产精品 | 色婷婷久久久亚洲一区二区三区 | 国产黄av | 国产精品国产三级国产在线观看 | 奇米777视频| 国产精品精品国产 | 国产精品999在线观看 | 农村妇女毛片精品久久久 | 欧美一区二区不卡视频 | 免费se99se| 美日韩精品 | 真人抽搐一进一出视频 | 亚洲一二三 | 成人小说亚洲一区二区三区 | 午夜第一页 | 久久人人爽人人爽人人片亚洲 | 国产精品久久久久久久久毛片 | 欧美9999 | 亚洲成年人影院 | 国产精品电影网 | 免费a视频在线观看 | 俺去操 | 古代玷污糟蹋np高辣h文 | 久久久久国产精品一区二区 | 午夜精品福利在线 |