APP架构:一个Activity通过Navigation导航到多个fragment
示例:
//MyViewModel
//创建MyViewModel类,在类内定义LiveData
//定义数据操作的函数
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer>number;
public MutableLiveData<Integer>getNumber(){
if(number == null){
number = new MutableLiveData<>();
number.setValue(0);
}
return number;
}
public void add(int x) {
number.setValue(number.getValue() + x);
if(number.getValue() < 0) {
number.setValue(0);
}
}
}
/**
* 定义主页面Fgment
* //在匿名内部类中调用需要加final修饰符
*
* 1.创建myViewModel对象
* 2.关联viewmodel和activity
* 3.创建碎片binding类对象
* 4.binding XML
* 5.binding 数据源
* 6.binding 观察者
*
*
*/
public class MasterFragment extends Fragment {
public MasterFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//在匿名内部类中调用需要加final修饰符
final MyViewModel myViewModel;
myViewModel = new ViewModelProvider(getActivity()).get(MyViewModel.class);
FragmentMasterBinding binding;
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_master,container,false);
binding.setData(myViewModel);
binding.setLifecycleOwner(getActivity());
binding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavController controller = Navigation.findNavController(v);
controller.navigate(R.id.action_masterFragment_to_detailFragment);
}
});
binding.seekBar.setProgress(myViewModel.getNumber().getValue());
binding.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
myViewModel.getNumber().setValue(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
return binding.getRoot();
}
}
//同理,通过设置viewmodel,livedata,binding后
// 数据的操作在View Model类内,Fgment内只留下导航代码,控件代码
public class DetailFragment extends Fragment {
MyViewModel myViewModel ;
public DetailFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
myViewModel = new ViewModelProvider(getActivity()).get(MyViewModel.class);
FragmentDetailBinding binding;
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_detail,container,false);
binding.setData(myViewModel);
binding.setLifecycleOwner(getActivity());
binding.button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavController navController = Navigation.findNavController(v);
navController.navigate(R.id.action_detailFragment_to_masterFragment);
}
});
return binding.getRoot();
}
}