過去の質問 ViewModelを取得する方法は? 、および私が見つけた例に関連して、それは私のケースを解決しません。そこにコメントする許可がないので、もう一度質問する必要があります。私が見つけたすべての例やドキュメントのように、「of」メソッドを使用したいViewModelProvidersクラスがありません。
model = ViewModelProviders.of(this).get(Something.class);
Android Studioで、依存関係として追加する「Android.Arch.lifecycle:extensions」が見つかりません。検索すると「何も表示されません」と表示されます。API27を使用しています。 、非推奨ではない要素を使用しようとすると、フラグメントにこれがあります:
public class EventDetailsFragment extends Fragment
{
EventViewModel viewModel;
@Override
public void onActivityCreated (Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication());
// HERE IS THE ISSUE: Seems not good practice to have to create a new ViewModelProvider every time this Fragment is created.
// Perhaps I should just create a singleton ViewModelProvider in the Activity or Application,
// so here could call getActivity().getViewModelProvider(this, factory).
ViewModelProvider viewModelProvider = new ViewModelProvider(this, factory);
viewModel = viewModelProvider.get(EventViewModel.class);
...
}
私は何をすべきか?
開いた app/build.gradle
、dependencies
ブロックを見つけて、ライフサイクルの依存関係を手動でリストに追加します。
dependencies {
implementation 'Android.Arch.lifecycle:extensions:1.1.1'
// ...
}
プロジェクトを同期すると、後でViewModelのインスタンスを取得できるはずです。
AndroidとJavaの知識が豊富な場合は、MVVM
アーキテクチャを学習してみてください。このコードをbaseFragment
メソッドに入れて、次のようにします。
abstract class BaseFragment extends Fragment() {
//kotlin
fun <T : ViewModel?> getViewModel(activity: FragmentActivity, modelClass: Class<T>): T {
return ViewModelProviders.of(this, ViewModelFactory(activity)).get(modelClass)
}
//bytecode to Java is this :/
public final ViewModel obtainViewModel(@NotNull FragmentActivity activity, @NotNull Class modelClass) {
return ViewModelProviders.of((Fragment)this, (Factory)(new
ViewModelFactory((Activity)activity))).get(modelClass);
}
}
また、このコードをonActivityCreatedではなくonViewCreated
に配置しないでください
// kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = obtainViewModel(requireActivity(), KebabFragmentViewModel::class.Java)
}
// Java bytecode
public void onViewCreated(@NotNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.viewModel = (RollerFragmentViewModel)this.obtainViewModel(getFragmentActivity(), RollerFragmentViewModel.class);
}
そして今、ネットワーク操作やより長い時間がかかる可能性のあるもののために、onViewCreatedmbyのviewModelの場所から何かのオブザーバーが必要です
// kotlin
viewModel.list.observe(this, Observer { list ->
list?.let {
viewModel.myKebabAdapter.updateList(list)
}
})
//Java
this.viewModel.getErrorMessage().observe((LifecycleOwner)this, (Observer)(new Observer() {
...
public final void onChanged(@Nullable List list) {
this.viewModel.myKebabAdapter.updateKebabList(list)
}
}
そしてviewModelで、uはactivity/fragment
で観察するための素敵な変数を取得しました
// kotlin
var list: MutableLiveData<MutableList<User>> = MutableLiveData()
// Java variable and getter
@NotNull
private MutableLiveData userList;
@NotNull
public final MutableLiveData getUserList() {
return this.userList;
}
ここで、app/build.gradle
ブロックに依存関係dependencies{}
が必要です
//lifecycle
implementation "Android.Arch.lifecycle:extensions:1.1.1"
implementation "Android.Arch.lifecycle:viewmodel:1.1.1"
// RxJava
implementation "io.reactivex.rxjava2:rxkotlin:2.2.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.10"
それを適切に行う方法をいくつかのブログチュートリアルで見つけてください。私は個人的に好きではありません https://developer.Android.com/ 以前はフォローするのが難しかったです。ミディアムを試してください。
GL。そしてJavaコードはほとんど逆コンパイルされているので、うまくいくことを願っています。