2017-09-26 3 views
6

Ich benutze Android AAC-Bibliothek und Android-Datenbindung Bibliothek in meinem Projekt. Ich habe AuthActivity und AuthViewModel erweitert androids ViewModel-Klasse. In einigen Fällen muss ich nach Activity fragen, um einige Methoden für ViewModel aufzurufen. Zum Beispiel wenn der Benutzer auf die Schaltfläche Google Auth oder Facebook Auth klickt, die in der Aktivitätsklasse initialisiert wurde (da zur Initialisierung von GoogleApiClient ein Aktivitätskontext benötigt wird, den ich nicht an ViewModel übergeben kann, kann das Ansichtsmodell keine Aktivitätsfelder speichern). All Logik mit Google Api und Facebook-API in Aktivitätsklasse implementiert:Android ViewModel Anruf Aktivität Methoden

//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, 

Auch ich brauche Zeichen in der Absicht zu nennen, die zu Aktivität Kontext erfordert:

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

ich nicht Facebook Login und Google anfordern Login oder startActivity Absicht von Modellklasse Ansicht, so erstellt i Klasse Schnittstelle AuthActivityListener:

public interface AuthActivityListener { 
    void requestSignedIn(); 

    void requestGoogleAuth(); 

    void requestFacebookAuth(); 

    void requestShowDialogFragment(int type); 
} 

Implementieren Zuhörer in Aktivitätsklasse:

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); 
     } 
     ... 

und ordnen diese Hörer in Klassenansicht Modell Aktivität Methoden aufzurufen:

// in constructor 
this.authRequester = listener; 

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

Nachdem Google der oder Authentifizierung i Methode Ansicht Modell aus Aktivität Aufruf übergeben:

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

Kann mir jemand erklären, ist dieser Ansatz der Kommunikation zwischen Ansichtsmodell und Aktivität richtig, oder muss ich einen anderen Weg finden, Aktivitätsmethoden vom Ansichtsmodell aufzurufen?

+0

Hey, hast du die richtige MVVM-Struktur für Google und Facebook gefunden? Ich suche nach dem gleichen. – iMDroid

Antwort

-1

Nun, Ihr Ansatz ist ziemlich gut. Aber irgendwie hängt Ihre Schnittstelle von der Aktivität ab. Wenn Sie Ihre Ansicht wiederverwenden, macht diese Schnittstelle keinen Sinn oder Sie müssen für dieses Szenario eine neue Schnittstelle erstellen, um Ihr Problem zu lösen.

Wenn Sie jedoch eine Instanz von Activity erstellen, haben Sie die Kontrolle darüber.

Verwandte Themen