web-dev-qa-db-ja.com

Android MVVM-ViewModelでアクティビティを参照する方法

MVVMアーキテクチャ、

これは私の見解(活動)です:

_private MyApp app;
private MainActivityVM viewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (MyApp) this.getApplication();
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

MainActivityVM.Factory factory = new MainActivityVM.Factory(app);

final MainActivityVM model = ViewModelProviders.of(this, factory)
.get(MainActivityVM.class);

viewModel = model;
binding.setVm(viewModel);
viewModel.onCreate();
_

およびビューモデル:

_public class MainActivityVM extends AndroidViewModel implements ViewModel {

    public MainActivityVM(@NonNull Application application) {
        super(application);
    }

    @Override public void onCreate() {
         model = new MyService();
         model.getData(); /* <-- how do i pass the activity here? */
    }

    @Override public void onPause() { }

    @Override public void onResume() { }

    @Override public void onDestroy() { }

    public static class Factory extends ViewModelProvider.NewInstanceFactory {

        @NonNull
        private final Application mApplication;

        public Factory(@NonNull Application application) {
            mApplication = application;
        }

        @Override
        public <T extends Android.Arch.lifecycle.ViewModel> T create(Class<T> modelClass) {
            return (T) new MainActivityVM(mApplication);
        }
    }
}
_

およびモデル:

_public class myService{

    public getData(){
        if(permissionacquired(){
            getdata()
        }else{
            requestPermission();
        }
    }

    private void requestPermission() {
        PermissionKey permKey = new PermissionKey(HealthConstants.StepCount.HEALTH_DATA_TYPE, PermissionType.READ);
        HealthPermissionManager pmsManager = new HealthPermissionManager(mStore);
        try {
            // Show user permission UI for allowing user to change options

            /* BELOW CODE REQUIRE Activity reference to PASS */

            pmsManager.requestPermissions(Collections.singleton(permKey), MainActivity.this).setResultListener(result -> {

            /* ABOVE CODE REQUIRE Activity reference to PASS */

            Log.d(APP_TAG, "Permission callback is received.");
            Map<PermissionKey, Boolean> resultMap = result.getResultMap();

                if (resultMap.containsValue(Boolean.FALSE)) {
                    updateStepCountView("");
                    showPermissionAlarmDialog();
                } else {
                    // Get the current step count and display it
                    mReporter.start(mStepCountObserver);
                }
            });
        } catch (Exception e) { Log.e(APP_TAG, "Permission setting fails.", e); }
    }

}
_

EDIT:モデルにリクエスト権限が表示されている場合、APIではアクティビティを渡す必要があります-アクティビティ参照をリクエスト権限に渡すにはどうすればよいですか?

Modelから取得許可メソッドがあります。私のサービスプロバイダーからのこのgetpermissionメソッドにはアクティビティが必要です。 requestPermission(Activity)

そのため、ModelViewには、別のソースからのdataServiceであるモデルオブジェクトがあります。

次に、ViewModelでActivityを参照して、ViewModelでmodel.requestPermission(Activity);を呼び出すにはどうすればよいですか?

ここ からの理解:

注意:ViewModelは、ビュー、ライフサイクル、またはアクティビティコンテキストへの参照を保持する可能性のあるクラスを参照してはなりません。

7
AnD

OnCreate()メソッドでパーミッションが必要な限り、パーミッションリクエストを含むロジックをアクティビティに移動し、リクエスト結果をviewModelに渡すことができます。

1
Karol Kulbaka