2017-09-26 244 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实例,那么您可以控制它。