我是 android 應用程式開發的新手。請幫忙。我想直接在我的視圖模型類中獲取導航片段引數。我正在使用資料系結。
這是我的導航片段引數
<fragment>
......
..
<action
android:id="@ id/action_update_to_listOfStudentFragment"
app:destination="@id/list_fragment" />
<argument
android:name="currentStudent"
app:argType="com.example.school.model.Student" />
</fragment>
當我單擊我的回收站視圖項時,我通過導航操作傳遞引數物件。所以我在配接器的 onbind 函式中設定了點擊監聽器。我將學生物件作為引數傳遞。
holder.itemLayoutBinding.root.setOnClickListener {
val action = ListOfStudentFragmentDirections.actionListOfStudentFragmentToUpdate(currentStudent)
holder.itemLayoutBinding.root.findNavController().navigate(action)
}
我的視圖模型在這里。我想知道另一件事:我在這里使用 AndroidViewModel 作為資料庫背景關系。有沒有其他方法可以避免 AndroidViewModel?我想使用 ViewModel 但視圖模型不提供背景關系。
class MainModleView(application: Application) : AndroidViewModel(application) {
val getAllStudentData: LiveData<List<Student>>
val repository: Repository
val inputName = MutableLiveData<String>()
val inputAge = MutableLiveData<String>()
init {
val studentDao: StudentDao = StudentDatabase.getAllData(application).studentDao()
repository = Repository(studentDao)
getAllStudentData = repository.getAllData
}
因此,在 View-Model 的實時資料中,我想從片段引數中設定inputName和inputAge值。這是我想要的示例。
inputName.value = fragmentsarugments.name //arguments pass a model object from recyclerview on click function
inputAge.value = fragmentsarugments.age
請給我一個解決方案。我只想在我的ViewModel 中獲取片段的引數。
uj5u.com熱心網友回復:
我認為這很容易。只需一行代碼即可完成您的作業。
class YourModleView(
savedStateHandle: SavedStateHandle
) : ViewModel()
此處 savedstatehandle 將提供您的導航片段引數。您的引數型別是 Studnet 類。
val myObject:Student = savedStateHandle["argument name in navigation"]
現在從您的片段操作傳遞引數物件。您將使用 savestatehandle 獲得每個傳遞的引數物件。
myObject.something
你會得到你的傳遞物件。
uj5u.com熱心網友回復:
將 aViewModelProviderFactory用于自定義引數。您可以在初始化視圖模型時直接傳遞引數。
class MeterListViewModelFactory implements ViewModelProvider.Factory {
private final MainRepository mainRepository;
private final Bundle mExtras;
private final Context context;
public MeterListViewModelFactory(Context context, MainRepository mainRepository, Bundle mExtras) {
this.mainRepository = mainRepository;
this.context = context;
this.mExtras = mExtras;
}
@NonNull
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass.equals(MeterListViewModel.class))
//noinspection unchecked
return (T) new MeterListViewModel(context,mainRepository, mExtras);
return super.create(modelClass);
}
}
像這樣創建視圖模型
viewModel = new ViewModelProvider(this, new MeterListViewModelFactory(LdpApplication.getAppContext(), new MainRepository(new MainRemoteDataSource()
, new MainCachedDataSource(AppRoomDatabaseImpl.getInstance(requireContext()).getAppDatabase())), getArguments())).get(MeterListViewModel.class);
然后你可以從傳遞的引數初始化你的變數
public MeterListViewModel(Context context, MainRepository mainRepository, Bundle mExtras) {
this.mainRepository = mainRepository;
mContext = context;
if (mExtras != null && mExtras.containsKey(AppConstants.K_METER_TYPE))
metersType.setValue((MetersType) mExtras.getSerializable(AppConstants.K_METER_TYPE));
if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_all))) {
lastSelectedPosition = 0;
} else if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_sign_off_pending))) {
lastSelectedPosition = 1;
} else if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_sign_off_pending_for_approval))) {
lastSelectedPosition = 2;
} else if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_sign_off_done))) {
lastSelectedPosition = 3;
} else {
lastSelectedPosition = 4;
}
selectedFilterItem = mExtras.getString(AppConstants.K_COMMISSION_FILTER);
commissionFilters = HelperClass.getCommissionFilters(context);
this.loadMeters(null, true);
}
uj5u.com熱心網友回復:
將引數傳遞給視圖模型
StudentFragment :Fragment(){
private val args: StudentFragmentArgs by navArgs()
private var viewModel:ViewModel?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(MainModleView.class)
vviewModel.inputName.value = args.Student
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514036.html
