2017-09-26 18 views
6

मैं अपने प्रोजेक्ट में एंड्रॉइड एएसी लाइब्रेरी और एंड्रॉइड डाटाबेसिंग लाइब्रेरी का उपयोग कर रहा हूं। मेरे पास AuthActivity है और AuthViewModel एंड्रॉइड के व्यू मॉडेल क्लास को बढ़ाता है। कुछ मामलों में मुझे ViewModel के लिए कुछ तरीकों को कॉल करने के लिए गतिविधि के लिए पूछना होगा। उदाहरण के लिए जब उपयोगकर्ता Google Auth या Facebook Auth बटन पर क्लिक करता है, जो गतिविधि वर्ग में प्रारंभ होता है (क्योंकि GoogleApiClient को प्रारंभ करने के लिए मुझे गतिविधि संदर्भ की आवश्यकता होती है जिसे मैं व्यूमोडेल में नहीं भेज सकता, मॉडल देखें गतिविधि फ़ील्ड को स्टोर नहीं कर सकता)। गूगल एपीआई और फेसबुक एपीआई के साथ सभी तर्क गतिविधि वर्ग में लागू:एंड्रॉइड व्यू मॉडेल कॉल गतिविधि विधियां

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

मैं फेसबुक लॉगइन और गूगल का अनुरोध नहीं कर सकते हैं:

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

इसके अलावा मैं आशय साइन इन कॉल करने की आवश्यकता है जो भी गतिविधि संदर्भ की आवश्यकता है

public interface AuthActivityListener { 
    void requestSignedIn(); 

    void requestGoogleAuth(); 

    void requestFacebookAuth(); 

    void requestShowDialogFragment(int type); 
} 

में श्रोता को लागू करें: लॉगिन, दृश्य मॉडल वर्ग से या startActivity इरादे, तो मैं वर्ग इंटरफ़ेस AuthActivityListener बनाया गतिविधि वर्ग:

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

:

@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 और फेसबुक साइन इन के लिए उचित एमवीवीएम संरचना मिली है? मैं इसकी तलाश कर रहा हूं। – iMDroid

उत्तर

-1

अच्छी तरह से आपका दृष्टिकोण काफी अच्छा है। लेकिन किसी भी तरह आपका इंटरफ़ेस गतिविधि पर निर्भर करता है, यदि आप अपने विचार का पुन: उपयोग कर रहे हैं तो इन इंटरफ़ेस का कोई उपयोग नहीं होता है या उस परिदृश्य के लिए हो सकता है कि आपको अपनी समस्या का समाधान करने के लिए नया इंटरफ़ेस बनाना होगा।

लेकिन यदि आप गतिविधि का उदाहरण बनाते हैं तो आपके पास इसका नियंत्रण होता है।

संबंधित मुद्दे