すべてのアクティビティで使用する1つのViewModelをインスタンス化しようとしています。
_public class LaunchActivity extends Activity {
private Controller control;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
control = ViewModelProviders.of(this).get(Controller.class);
}
}
_
しかし、control = ViewModelProviders.of(this) <--
でof(this)
を解決できないというエラーが表示されましたが、例に基づいて here by Android ViewModelの実装に関する開発者、ViewModelを拡張するクラスは、Activityでインスタンス化できるはずですよね?
私がやっていることが間違っている場合、アクティビティのViewModelオブジェクトをどのようにインスタンス化すればよいですか? ViewModelProviders.of()
はフラグメントでのみ機能するので、フラグメントでn
個のアクティビティを作成する必要がありますか?
support library
アクティビティを使用する必要があります。
AppCompatActivity
またはFragmentActivity
@elmorabeaの答えは正しかったが、ここで注意すべき重要な点の1つは、 AndroidX を有効にしても、アクティビティではなくフラグメントを渡す必要があることを示す問題が引き続き発生する場合は、クラスはcorrectAppCompatActivityを拡張します。 IE、使用していることを確認してください:
import androidx.appcompat.app.AppCompatActivity;
ではなく
import Android.support.v7.app.AppCompatActivity;
1つはAndroidXからで、もう1つはそうではありません。 AndroidXの移行の詳細については、 this リンクを参照してください。
Activity
を拡張しています。 ViewModelProviders
はFragmentActivity
や、AppCompatActivity
などの継承オブジェクトから機能します。 Fragment
(Android.support.v4.app.Fragment
)。ネイティブActivity
またはFragment
クラスの公式サポートはありません。
別のActivityクラスから拡張するようにアクティビティを変更したくない場合の別の解決策(BaseActivityがすでに使用されており、Activity
に大きく依存しているため、親アクティビティクラスを変更するとエラーが発生する場合があります):
_@Nullable
private ViewModelStore viewModelStore = null;
@Override
public Object onRetainNonConfigurationInstance() {
return viewModelStore;
}
@NonNull
private ViewModelStore getViewModelStore() {
Object nonConfigurationInstance = getLastNonConfigurationInstance();
if (nonConfigurationInstance instanceof ViewModelStore) {
viewModelStore = (ViewModelStore) nonConfigurationInstance;
}
if (viewModelStore == null) {
viewModelStore = new ViewModelStore();
}
return viewModelStore;
}
public ViewModelProvider getViewModelProvider() {
ViewModelProvider.Factory factory =
ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
return new ViewModelProvider(getViewModelStore(), factory);
}
_
このロジックはFragmentActivity
にあるものと似ています
次に、ViewModelProviders.of(this)
を呼び出す代わりに、getViewModelProvider()
を呼び出すだけです。 Controller
を取得する場合:
_control = getViewModelProvider().get(Controller.class)
_
これにより、_Android.Arch.lifecycle:extensions
_依存関係を追加する必要がなくなります。
私はこれを使用しています:
LoginViewModel viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
参照: https://developer.Android.com/topic/libraries/architecture/viewmodel#Java