这一章来说数据绑定和MVVM
这边会学到数据绑定这个新工具,然后实现Model-View-View-Model新架构,还会使用资源系统存储声音文件
在设计时我们需要知道控制器到底做了哪一些工作,再把这些工作拆分到独立的小类中,让一个个拆开的小类协同工作
,如何确定控制器的不同使命,我们应该确定自己的架构。
对于mvvm架构来说,它把控制器的臃肿的代码抽到布局文件里,让开发人员很清楚知道哪些是动态界面,同时它也可以抽出部分动态控制器代码放在ViewModel类中,这就方便了开发测试和验证
一首先,先创建一个名为BeatBoxActivity的空activity,然后这边需要用到RecyclerView,所以这边需要对它添加依赖
,应用会显示一排排播放声音的按钮,因此就需要两个布局文件,,分别用于网格和按钮
(1)首先先创建RecyclerView的布局文件,把导引生成的布局文件改名为fragment——beat_box.xml,然后对于创建主布局文件,<android:support.v7.widget.RecyclerView
xmlns:android="http://schamas.android.com/apk/res/android"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
(2)然后创建BeatBoxFragment
public class BeatBoxFragment extends Fragment {
public static BeatBoxFragment newInstance(){
return new BeatBoxFragment();
}
}
(3)在这边清空之前建立的BeatBoxActivity的内容,然后让它去继承之前项目的SingleFragmentActivity {
protected Fragment createFragment(){
return BeatBoxFragment.newInstance();
}
}
二下面是来实现简单的数据绑定
(1)这边要把实例化fragment_beat_box.xml和RecyclerView关联起来,这次我们用数据绑定来实现,首先需要要app/build.gradle文件里面启动数据绑定
在buildType的里面添加下面的代码
dataBinding{
enabled = true
}
下面的行为会打开IDE的整合功能,允许你使用数据绑定产生的类,并把他们整合到编译中去
(2)要在布局中使用数据绑定,那么就要把一般布局改造成数据绑定布局,具体的做法就是把整个布局定义放入<layout>标签中去
如下面的代码
<layout
xmlns:android="http://schamas.android.com/apk/res/android"
<android:support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</layout>
<layout>告诉数据绑定工具“这个布局由你决定”接到任务后,数据绑定工具就会帮我们生成一个绑定类,新生成的绑定类默认以布局文件来命名,就像现在 fragment_beat_box.xml布局文件就生成了FragmentBeatBoxBinding这个绑定类
这个就是用来做数据绑定的类,
(3)现在实例化视图层级结构时,不再使用LayoutInflater,而是实例化FragmentBeatBoxBinding类,在一个叫为getRoot()的getter的方法中,FragmentBeatBoxBinding引用布局视图结构,而且也会引用那些在布局文件中以android:id标签引用的其他视图
所以此时这个绑定类有两个引用,getRoot()和recyclerView,前者是指整个布局,后面是指RecyclerView.
(4)现在就是来使用这个绑定类了,在BeatBoxFragment里覆盖onCreateView()方法然后使用DataBindingUtil实例化FragmentBeatBoxBinding,如下面代码
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
FragmentBeatBoxBinding binding = DataBindingUtil.inflate(inflater,R.layout.fragment_beat_box,cotainer,false);
return binding.getRoot();
}
(5)实例化绑定类后就可以来获取和设置RecyclerView了
public View onCreateView(LayoutInflater inflater,ViewGr