2017-09-26 42 views
6

我在我的項目中使用了android AAC庫和Android數據綁定庫。我有AuthActivity和AuthViewModel擴展了android的ViewModel類。在某些情況下,我需要請求Activity爲ViewModel調用一些方法。 例如,當用戶點擊在Activity類中初始化的Google Auth或Facebook Auth按鈕(因爲要初始化GoogleApiClient,我需要Activity無法傳遞給ViewModel的Activity上下文,查看模型無法存儲活動字段)。 與谷歌阿比和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, 

此外,我需要調用登錄意圖它需要太多的活動背景:

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

我不能要求Facebook登錄和谷歌從視圖模型類的登錄,或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); 
     } 
     ... 

,並指定該監聽器在視圖模型類調用活性的方法:

// in constructor 
this.authRequester = listener; 

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

谷歌或Facebook的身份驗證通過後,我打電話視圖模型方法從活動:

@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("", ""); 
       } 
      } 
     } 
    } 

任何人都可以解釋我是視圖模型和活動之間的溝通方式是正確的,或者我需要找到另一種方式從視圖模型中調用活動方法?

+0

嘿,你是否找到適合Google和Facebook登錄的MVVM結構?我正在尋找同樣的東西。 – iMDroid

回答

-1

以及你的方法是相當不錯的。但不知何故,你的界面取決於活動意味着如果你重複使用你的視圖這些界面沒有用處,或者可能是爲了這種情況,你必須創建新的界面來解決你的問題。

但是,如果您創建了一個Activity實例,那麼您可以控制它。