电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android ViewBinding的使用詳解

瀏覽:6日期:2022-09-19 14:56:33

最近Android Studio 升級后 butterknife 有一個警告:

Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them as annotation attributes

查看官網發現:

Android ViewBinding的使用詳解

butterknife已經棄用,建議使用 view binding 替換。

一、什么是view binding

官方介紹:

通過視圖綁定功能,您可以更輕松地編寫可與視圖交互的代碼。在模塊中啟用視圖綁定之后,系統會為該模塊中的每個 XML 布局文件生成一個綁定類。綁定類的實例包含對在相應布局中具有 ID 的所有視圖的直接引用。

在大多數情況下,視圖綁定會替代 findViewById。

設置說明 android studio 必須是3.6及更高版本。 com.android.tools.build:gradle 需要 3.6.0及更高版本。 build.gradle 中啟用功能,不同模塊要分別設置。

android { ... viewBinding { enabled = true } buildFeatures {viewBinding = true }}二、基本用法Activity中使用

在 Activity 的 onCreate() 方法中執行以下步驟:

調用生成的綁定類中包含的靜態 inflate() 方法。 通過調用 getRoot() 方法獲取對根視圖的引用。 將根視圖傳遞到 setContentView(),使其成為屏幕上的活動視圖。

private ResultProfileBinding binding; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ResultProfileBinding.inflate(getLayoutInflater());View view = binding.getRoot();setContentView(view); }

現在即可使用該綁定類的實例來引用任何視圖:

binding.getName().setText(viewModel.getName());binding.button.setOnClickListener(new View.OnClickListener() {viewModel.userClicked()});

現在即可使用該綁定類的實例來引用任何視圖:

binding.getName().setText(viewModel.getName());binding.button.setOnClickListener(new View.OnClickListener() {viewModel.userClicked()});Fragment 中使用

在 Fragment 的 onCreateView() 方法中執行以下步驟:

調用生成的綁定類中包含的靜態 inflate() 方法。 通過調用 getRoot() 方法獲取對根視圖的引用。 從 onCreateView() 方法返回根視圖,使其成為屏幕上的活動視圖。 在 onDestroyView() 中銷毀綁定類。

private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {binding = ResultProfileBinding.inflate(inflater, container, false);View view = binding.getRoot();return view; } @Override public void onDestroyView() {super.onDestroyView();binding = null; } Adapter 中使用

public class TestAdapter extends BaseAdapter { private List<String> datas; private final LayoutInflater mInflater; public TestAdapter(List<String> datas, Context context) { this.datas = datas; this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int i) { return i; } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; if (view == null) { AdapterTestBinding binding = AdapterTestBinding.inflate(mInflater, viewGroup, false); viewHolder = new ViewHolder(binding); view = binding.getRoot(); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } viewHolder.binding.tvContent.setText(datas.get(i)); return view; } static class ViewHolder { private final AdapterTestBinding binding; public ViewHolder(AdapterTestBinding binding) { this.binding = binding; } }}三、了解源碼實現

項目運行后,每個布局文件都會生成對應的binding類,比如 activity_main.xml 會生成 ActivityMainBinding.java 文件,路徑如下:

appbuildgenerateddata_binding_base_class_source_outdebugout包名databinding

代碼其實很簡單就是加載布局,然后對控件進行初始化:

public final class ActivityMainBinding implements ViewBinding { @NonNull private final LinearLayout rootView; @NonNull public final WebView wv; private ActivityMainBinding(@NonNull LinearLayout rootView, @NonNull WebView wv) { this.rootView = rootView; this.wv = wv; } @Override @NonNull public LinearLayout getRoot() { return rootView; } @NonNull public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) { return inflate(inflater, null, false); } @NonNull public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, boolean attachToParent) { View root = inflater.inflate(R.layout.activity_main, parent, false); if (attachToParent) { parent.addView(root); } return bind(root); } @NonNull public static ActivityMainBinding bind(@NonNull View rootView) { // The body of this method is generated in a way you would not otherwise write. // This is done to optimize the compiled bytecode for size and performance. String missingId; missingId: { WebView wv = rootView.findViewById(R.id.wv); if (wv == null) {missingId = 'wv';break missingId; } return new ActivityMainBinding((LinearLayout) rootView, wv); } throw new NullPointerException('Missing required view with ID: '.concat(missingId)); }}

ViewBinding 的源碼如下:

public interface ViewBinding { /** * Returns the outermost {@link View} in the associated layout file. If this binding is for a * {@code <merge>} layout, this will return the first view inside of the merge tag. */ @NonNull View getRoot();}

可以對代碼稍加改造,減少 Activity 、Fragment 、Adapter 中的重復代碼。

BaseActivity

public abstract class BaseActivity<T extends ViewBinding> extends AppCompatActivity { protected T binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = getBinding(); setContentView(binding.getRoot()); } protected abstract T getBinding();}BaseFragment

public abstract class BaseFragment<T extends ViewBinding> extends Fragment { protected Context context; protected T binding; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = getBinding(inflater, container); return binding.getRoot(); } protected abstract T getBinding(LayoutInflater inflater, ViewGroup container); @Override public void onDestroyView() { super.onDestroyView(); binding = null; } @Override public void onAttach(@NonNull Context context) { super.onAttach(context); this.context = context; } @Override public void onDetach() { super.onDetach(); this.context = null; }}

public class TestFragment extends BaseFragment<FragmentTestBinding>{ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); binding.tvContent.setText('this is test'); } @Override protected FragmentTestBinding getBinding(LayoutInflater inflater, ViewGroup container) { return FragmentTestBinding.inflate(inflater, container, false); }}BaseAdapter

public abstract class MyAdapter<T extends ViewBinding> extends BaseAdapter { private final LayoutInflater inflater; public MyAdapter(Context context) { inflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (null == convertView) { T binding = getBinding(inflater, parent); holder = new ViewHolder(binding); convertView = binding.getRoot(); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } handleData(position, holder.binding); return convertView; } protected abstract void handleData(int position, T binding); protected abstract T getBinding(LayoutInflater inflater, ViewGroup parent); class ViewHolder { private final T binding; public ViewHolder(T binding) { this.binding = binding; } }}

public class TestAdapter extends MyAdapter<AdapterTestBinding> { private List<String> datas; public TestAdapter(List<String> datas, Context context) { super(context); this.datas = datas; } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int i) { return i; } @Override public long getItemId(int i) { return i; } @Override protected void handleData(int position, AdapterTestBinding binding) { binding.tvContent.setText(datas.get(position)); } @Override protected AdapterTestBinding getBinding(LayoutInflater inflater, ViewGroup parent) { return AdapterTestBinding.inflate(inflater, parent, false); }}四、其他

如果布局中有使用 <include> 標簽,需要給 <include> 設置id,才可以獲取到組合控件中的元素。

<!-- 一個簡單的標題欄布局 --><?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' android:orientation='horizontal' android:layout_width='match_parent' android:layout_height='wrap_content'> <ImageView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://www.hdgsjgj.cn/bcjs/@mipmap/ic_launcher'/> <TextView android:layout_width='wrap_content' android:layout_height='wrap_content' android: android:text='this is title'/></LinearLayout>

<?xml version='1.0' encoding='utf-8'?><LinearLayout 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' android:orientation='vertical'> <!-- 使用組合控件 --> <include layout='@layout/view_title' android: /> <TextView android:layout_width='match_parent' android:layout_height='wrap_content' android: android:text='test'/></LinearLayout>

public class TestFragment extends BaseFragment<FragmentTestBinding>{ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); binding.tvContent.setText('this is test'); //通過 include 的id找到對應的控件 binding.viewTitle.tvTitle.setText('this is title'); } @Override protected FragmentTestBinding getBinding(LayoutInflater inflater, ViewGroup container) { return FragmentTestBinding.inflate(inflater, container, false); }}

以上就是Android ViewBinding的使用詳解的詳細內容,更多關于Android ViewBinding的使用的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 喷砂机厂家_自动除锈抛丸机价格-成都泰盛吉自动化喷砂设备 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 湖北省煤炭供应链综合服务平台| 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 微量水分测定仪_厂家_卡尔费休微量水分测定仪-淄博库仑 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 护栏打桩机-打桩机厂家-恒新重工 | 小小作文网_中小学优秀作文范文大全 | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 海鲜池-专注海鲜鱼缸、移动海鲜缸、饭店鱼缸设计定做-日晟水族厂家 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 裹包机|裹膜机|缠膜机|绕膜机-上海晏陵智能设备有限公司 |