2017-09-26 2 views
6

私のプロジェクトでは、アンドロイドのAACライブラリとAndroidのデータバインディングライブラリを使用しています。私はAuthActivityを持っており、AuthViewModelはアンドロイドのViewModelクラスを拡張しています。場合によっては、ViewModelのいくつかのメソッドを呼び出すためにActivityを要求する必要があります。 たとえば、GoogleAuthClientを初期化するためにViewModelに渡すことができないアクティビティコンテキストが必要なため、アクティビティクラスで初期化されたGoogle AuthまたはFacebook Authボタンをクリックすると、ビューモデルにアクティビティフィールドが保存されません。 Activityクラスに実装GoogleのAPIとFacebookのAPIを持つすべてのロジック:Android ViewModelコールアクティビティメソッド

//google api initialization 
googleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this, this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

//facebook login button 
loginButton.setReadPermissions(Arrays.asList("email", "public_profile")); 
loginButton.registerCallback(callbackManager, 

また、私はあまりにもActivityコンテキストを必要とする意図でコールサインをする必要があります。

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); 
startActivityForResult(signInIntent, GOOGLE_AUTH); 

私はFacebookのログインやGoogleを要求することはできませんログイン、またはstartActivityビューモデルクラスから意図ので、私はクラスのインターフェイスAuthActivityListenerを作成:

public interface AuthActivityListener { 
    void requestSignedIn(); 

    void requestGoogleAuth(); 

    void requestFacebookAuth(); 

    void requestShowDialogFragment(int type); 
} 

でリスナーを実装アクティビティクラス:

AuthActivityRequester authRequestListener = new AuthActivityRequester() { 
     @Override 
     public void requestSignedIn() { 
      Intent intent = new Intent(AuthActivity.this, ScanActivity.class); 
      startActivity(intent); 
      AuthActivity.this.finish(); 
     } 

     @Override 
     public void requestGoogleAuth() { 
      Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); 
      startActivityForResult(signInIntent, GOOGLE_AUTH); 
     } 
     ... 

と活動のメソッドを呼び出すためにビューモデルクラスでこのリスナーを割り当てる:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     callbackManager.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == GOOGLE_AUTH) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       GoogleSignInAccount acct = result.getSignInAccount(); 
       if (acct != null) { 
        viewModel.onGoogleUserLoaded(acct.getEmail(), acct.getId()); 
       } else { 
        viewModel.onGoogleUserLoaded("", ""); 
       } 
      } 
     } 
    } 

// in constructor 
this.authRequester = listener; 

// call activity method 
public void onClickedAuthGoogle() { 
     authRequester.requestGoogleAuth(); 
} 

GoogleやFacebookの認証通過した後、私は活動からのビューモデルメソッドを呼び出します

誰も私に説明できるのは、ビューモデルとアクティビティの間のこの通信方法が正しいか、ビューモデルからアクティビティメソッドを呼び出す別の方法を見つける必要があるかどうかです。

+0

あなたはGoogleとFacebookのサインインのための適切なMVVM構造を見つけましたか?同じものを探しています。 – iMDroid

答えて

-1

あなたのアプローチはかなり良いです。しかし、どういうわけかあなたのインターフェースはアクティビティーに依存しています。ビューを再利用している場合、これらのインターフェースは役に立たないか、そのシナリオのために問題を解決するために新しいインターフェースを作成する必要があります。

しかし、アクティビティのインスタンスを作成した場合は、それを制御できます。