哪个网站帮忙做户型方案网络架构配置
哪个网站帮忙做户型方案,网络架构配置,wordpress主题 minecraft,威海泰浩建设集团有限公司网站简介
DataBinding是Google在18年推出的数据绑定框架#xff0c;采用了MVVM模式来降低各模块之间代码的耦合度#xff0c;使得整体代码逻辑设计更加清晰。众所周知#xff0c;MVVM类似于MVC#xff0c;主要目的是为分离View#xff08;视图#xff09;和Model#xff08…简介
DataBinding是Google在18年推出的数据绑定框架采用了MVVM模式来降低各模块之间代码的耦合度使得整体代码逻辑设计更加清晰。众所周知MVVM类似于MVC主要目的是为分离View视图和Model模型同时进行双向数据绑定当业务数据发生改变时View能及时刷新当View数据更新时同时能同步到Model。同时DataBinding能省去findViewById()操作大量减少Activity内代码根据业务场景可以让数据能单向或双向绑定到对应界面layout中能较好的避免空指针以及防范内存泄漏。
使用
启用方式在Module的build.gradle中构建
android { ... buildFeatures {dataBinding true }
}1、布局绑定
在要编写的布局文件中选定根布局按Alt回车快捷键唤出提示 选择第一个即可生成符合DataBinding规则的布局文件
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdata/dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivity.../androidx.constraintlayout.widget.ConstraintLayout
/layout可看见原根布局被包裹住了且布局元素上方出现 data标签在这 data标签是用于声明要用到的变量以及变量类型在MVVM模式中扮演的是一个View和Model通讯的中间人角色。
生成dataBinding规则的布局后数据绑定库会自定生成将布局中的视图和数据绑定所需的类类名为layout.xml文件名DataBinding的驼峰规则命名组合这点与ViewBinding类似。
比如我这个是MainActivity.class布局文件为activity_main.xml则相应绑定类类名为 ActivityMainBinding 。
2、绑定流程
步骤一先编写一个简单的实体Bean类
java版
public class UserInfo {public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}private String name;private int age;}kt版
data class UserInfo(val name: String,val age: Int) {}步骤二在布局文件中的里引用要使用到的变量名、类的全路径如下
datavariablenameUserInfoExampletypecom.example.dbjavatest.bean.UserInfo //data在这里中的name可以随意命名但建议跟实体bean类一致以免后续遗忘type则为对应实体bean类的全路径
PS 这里有两个极少数情况后续你可能发现如果要多出引用这个bean实体类要写不同的命名区分就会变成这样
datavariablenameUserInfoExampletypecom.example.dbjavatest.bean.UserInfo /variablenameUserInfoExample2typecom.example.dbjavatest.bean.UserInfo /...
/data这时候可以通过 import 标签声明所有用到的这个实体bean类以上代码即变为
dataimport typecom.example.dbjavatest.bean.UserInfo/variablenameUserInfoExampletypeUserInfo /variablenameUserInfoExample2typeUserInfo /...
/data如果import标签下两个类名相同哪怕全路径不同这里就要使用 alias 来指定别名如下
dataimport typecom.example.dbjavatest.bean.UserInfo/importaliasNewUserInfotypecom.example.dbjavatest.otherbean.UserInfo/variablenameUserInfoExampletypeUserInfo /variablenameUserInfoExample2typeNewUserInfo /...
/data步骤三在View中引入数据使用 {} 语法类名即为我们在中定义的name
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameUserInfoExampletypecom.example.dbjavatest.bean.UserInfo //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/tv_user_firstandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{UserInfoExample.name}app:layout_constraintTop_toTopOfparentapp:layout_constraintStart_toStartOfparent/TextViewandroid:idid/tv_user_secondandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{UserInfoExample.age}app:layout_constraintTop_toBottomOfid/tv_user_firstapp:layout_constraintStart_toStartOfparent//androidx.constraintlayout.widget.ConstraintLayout
/layout可以看出布局文件里第一个TextView的text通过{UserInfoExample.name}引用UserInfo的name属性第二个TextView的text通过{UserInfoExample.age}引用UserInfo的age属性。
步骤四在Activity中实现数据绑定
java版
public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding viewDataBinding DataBindingUtil.setContentView(this, R.layout.activity_main);UserInfo userInfo new UserInfo(亚历山大, 99);viewDataBinding.setUserInfoExample(userInfo);}
}kt版
class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val viewDataBinding: ActivityMainBinding DataBindingUtil.setContentView(this, R.layout.activity_main)viewDataBinding.userInfoExample UserInfo(亚历山大, 99)}
}可以看到这里不再需要传统的setContentView()指定布局了。直接通过 DataBindingUtil 设置布局文件并得到对应dataBinding对象并给相应属性赋值你可以发现此属性的setxxx()并不是bean实体类名而是布局中里的name属性名。
一运行发现报错 顺着提示找下原因在对应生成的ActivityMainBindingImpl.java类中的116行如下 原因就在此原UserInfo的实例getAge()返回的是int类型这里setText里只接受String按此推断修改原布局文件就可以了。
TextViewandroid:idid/tv_user_secondandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{String.valueOf(UserInfoExample.age)}app:layout_constraintTop_toBottomOfid/tv_user_firstapp:layout_constraintStart_toStartOfparent/按上述代码修改对应android:text“”中的属性运行后可正常发布 细心的你可能会发现xml预览界面中由于没有填写相应数值致使显示是一片空白。这样不利于我们去观察所设置的TextView颜色大小等属性实际表现结果这时我们可以去设置默认值来让其在预览界面中显示格式如下
android:text{UserInfoExample.name,defaultdefaultValue}我们修改原布局中元素属性为
TextViewandroid:idid/tv_user_firstandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{UserInfoExample.name,defaultdefaultValue}app:layout_constraintTop_toTopOfparentapp:layout_constraintStart_toStartOfparent/TextViewandroid:idid/tv_user_secondandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{UserInfoExample.age,default25}app:layout_constraintTop_toBottomOfid/tv_user_firstapp:layout_constraintStart_toStartOfparent/对应生成的预览界面为 3、Activity中使用
跟ViewBinding一样可通过ActivityMainBinding你对应的activity的dataBinding类来获取指定id控件例如
java版
viewDataBinding.tvUserFirst.setText(get到了第一个TextView);kt版
viewDataBinding.tvUserFirst.text get到了第一个TextView原布局中可在 data标签里指定对应的ViewBinding名称如果不指定就是默认根据文件名和驼峰原则生成的类名上面说的activity_main.xml和ActivityMainBinding。例如
data classDemoBinding...
/data指定中的class后原activity就已经开始报错了此时要修改对应的ViewBinding为 DemoBinding 。原来activity中代码则改为了
java版 ...DemoBinding viewDataBinding DataBindingUtil.setContentView(this, R.layout.activity_main);UserInfo userInfo new UserInfo(亚历山大, 99);viewDataBinding.setUserInfoExample(userInfo);...kt版 ...val viewDataBinding: DemoBinding DataBindingUtil.setContentView(this, R.layout.activity_main)viewDataBinding.userInfoExample UserInfo(亚历山大, 99)...4、在Fragment和RecyclerView中使用
在Fragment中的使用于Activity类似这里为了方便Fragment的布局fragment_main.xml内容就跟原activity_main.xml内容保持一致。其activity_main.xml引用此Fragment的布局就修改为Fragment中id不能省略
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameUserInfoExampletypecom.example.dbjavatest.bean.UserInfo //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityfragmentandroid:idid/fragment_layoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:namecom.example.dbjavatest.MainFragment//androidx.constraintlayout.widget.ConstraintLayout
/layoutFragment中代码表现则为
java
public class MainFragment extends Fragment {NullableOverridepublic View onCreateView(NonNull LayoutInflater inflater, Nullable ViewGroup container, Nullable Bundle savedInstanceState) {FragmentMainBinding viewDataBinding DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false);viewDataBinding.setUserInfoExample(屋大维,99);return viewDataBinding.getRoot();}
}kt
class MainFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {val viewDataBinding: FragmentMainBinding DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)viewDataBinding.userInfoExample UserInfo(屋大维,99)return viewDataBinding.getRoot()}...
}可见在Fragment中使用的是 DataBindingUtil对应的inflate在onCreateView中返回对应ViewBinding.getRoot。其他使用与在Activity中使用一致这里就不赘述。
同样使用DataBindingUtil.inflate来获取ViewBinding对象的是RecyclerView的Adapter中:
java版
...
NonNull
Override
public ViewBindHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {ViewDataBinding inflate DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_recyclerview,parent,false);ViewBindHolder viewHolder new ViewBindHolder(inflate);viewHolder.setmViewBing(viewHolder);return new ViewHolder(inflater);
}
Override
public void onBindViewHolder(NonNull ViewBindHolder holder, int position) {holder.bind(...);//传入的UserInfo
}
static class ViewBindHolder extends RecyclerView.ViewHolder{private ItemRecyclerviewBinding mViewBing;public ViewBindHolder(View view){super(view);}public void setmViewBing(ItemRecyclerviewBinding mViewBing) {this.mViewBing mViewBing;}public void bind(UserInfo userInfo){mViewBing.setUserInfoExample(userInfo);}
}
...kt版 NonNulloverride fun onCreateViewHolder(NonNull parent: ViewGroup, viewType: Int): ViewBindHolder? {val inflate: ViewDataBinding DataBindingUtil.inflate(LayoutInflater.from(parent.context),R.layout.item_recyclerview,parent,false)val viewHolder ViewBindHolder(inflate)viewHolder.setmViewBing(viewHolder)return RecyclerView.ViewHolder(inflater)}override fun onBindViewHolder(NonNull holder: ViewBindHolder?, position: Int) {
// holder.bind(...);//传入的UserInfo}class ViewBindHolder(view: View?) : RecyclerView.ViewHolder(view!!) {private var mViewBing: ItemRecyclerviewBinding? nullfun setmViewBing(mViewBing: ItemRecyclerviewBinding?) {this.mViewBing mViewBing}fun bind(userInfo: UserInfo?) {mViewBing!!.setUserInfoExample(userInfo)}}在onCreateViewHolder中通过DataBindingUtil去获取相应的dataBinding对象在ViewHolder中进行binding其余操作与Activity、Fragment差别不大这里不再赘述。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/87926.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!