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?
Hey, hast du die richtige MVVM-Struktur für Google und Facebook gefunden? Ich suche nach dem gleichen. – iMDroid