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();
}
}