2017-10-20 79 views
8

Mevcut Android uygulamalarına yerel olarak nasıl tepki verileceğini anlatan birçok makale buldum. Ancak bunların hiçbiri doğrudan Java android kaynak kodunda kullanmak için tepki yerel kodundan nasıl sonuç alacağını açıklamıyor.Mevcut bir android uygulamasına entegre edilmiş bir tepki yerel uygulamasından bir sonuç alın

Açıklamalar: Belirli bir işi yapan yerel bir uygulamaya sahibim ve sonucu bir açılır pencerede görüntüler. Ben bu özel bir sonucu benim android Java kaynak koduna bir tepki yerel pop-up içine görüntülemek yerine elde edebilmek için bu uygulamayı (gerekli değişiklikleri yapıyor) entegre etmek istiyorum.

Tüm internette aradım ama bunun hakkında hiçbir şey bulamadım.

+0

Yerel kod ile iyi değilim, ancak istenen veriyi parametre olarak kullanarak yeni bir yerel yöntem çalıştırılamıyor musunuz? – bennygenel

+0

Ben hedefinize ulaşmak için, 'android niyet' başvurmak gerektiğini düşünüyorum, tepkiyi çekmek için java içinde niyetini kullanın, sonra sonuç ile niyetinde niyetle https://facebook.github.io/react-native/releases/0.21/docs /intentandroid.html –

cevap

3

: onPress işleyicisi olarak,

import { 
    NativeModules 
} from 'react-native'; 

const NativeNameSubmission = NativeModules.NameSubmission; 

... 

    <Button 
     onPress={() => NativeNameSubmission.submitName(this.state.firstName, this.state.lastName)} 
     title="Submit"/> 

Anadiliniz Modülü böyle bir şey olmazdı senin Yerli Modülü arayıp parametreleri geçerdi modülünüzün etkinliğinizin referansına erişmesi gerekiyor.
İşte iki çözüm vardır:
- Senin modülü kullanılmak üzere ihtiyacı hatırlamak, modül

kurucuları içindedir etkinlik başvuru geçirin Ama -
aktivitesinin bir iç sınıf olarak modül beyan Bir ReactPackage ve ReactPackage bir arabirimdir, bu nedenle isterseniz, Reaktivite arayüzünüzü uygulayarak (yeni bir sınıf oluşturmak yerine) kullanabilirsiniz. İşte

bir faaliyet ReactPackage uygulayan bir inner class ve kullanarak tam çalışma örneğidir: başlatabilir, sonra

public class MyReactActivity extends AppCompatActivity 
    implements DefaultHardwareBackBtnHandler, ReactPackage 
{ 
    private ReactRootView mReactRootView; 
    private ReactInstanceManager mReactInstanceManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mReactRootView = new ReactRootView(this); 
     mReactInstanceManager = ReactInstanceManager.builder() 
       .setApplication(getApplication()) 
       .setBundleAssetName("index.android.bundle") 
       .setJSMainModuleName("index.android") 
       .addPackage(new MainReactPackage()) 
       // This activity is also a "ReactPackage" 
       .addPackage(this) 
       .setUseDeveloperSupport(BuildConfig.DEBUG) 
       .setInitialLifecycleState(LifecycleState.RESUMED) 
       .build(); 

     mReactRootView.startReactApplication(mReactInstanceManager, "MyReactComponent", null); 

     setContentView(mReactRootView); 
    } 

    @Override 
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
     List<NativeModule> modules = new ArrayList<>(); 
     // The module is added to the ReactPackage 
     modules.add(new TestModule(reactContext)); 
     return modules; 
    } 

    @Override 
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { 
     return Collections.emptyList(); 
    } 

    // Module definition as an inner class 
    public class TestModule extends ReactContextBaseJavaModule { 
     public TestModule(ReactApplicationContext reactContext) { 
      super(reactContext); 
     } 

     @Override 
     public String getName() { 
      return "TestModule"; 
     } 

     // The function you'll call from React Native 
     @ReactMethod 
     public void closewithresult(float datafromreact) { 
      // Set a result 
      Bundle bundle = new Bundle(); 
      bundle.putFloat("result", datafromreact); 
      setResult(Activity.RESULT_OK, (new Intent()).putExtras(bundle)); 

      // Close the activity 
      finish(); 
     } 
    } 

    /* 
    * Other overrided functions 
    * (not relevant for this question) 
    */ 
    @Override 
    public void invokeDefaultOnBackPressed() { 
     super.onBackPressed(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     if (mReactInstanceManager != null) { 
      mReactInstanceManager.onHostPause(this); 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     if (mReactInstanceManager != null) { 
      mReactInstanceManager.onHostResume(this, this); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     if (mReactInstanceManager != null) { 
      mReactInstanceManager.onHostDestroy(this); 
     } 
    } 

    @Override 
    public void onBackPressed() { 
     if (mReactInstanceManager != null) { 
      mReactInstanceManager.onBackPressed(); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) { 
      mReactInstanceManager.showDevOptionsDialog(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

} 

senin böyle ReactActivity:

Intent intent = new Intent(getApplicationContext(), MyReactActivity.class); 
startActivityForResult(intent, 123); 

böyle bir sonuç alın:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 123 && resultCode == Activity.RESULT_OK) { 
     float result = data.getExtras().getFloat("result"); 
     // Do whatever you want with "result" 
    } 
} 

Ve jus t Kullanılabilir:

import { NativeModules } from 'react-native'; 
// [...] 
// Call the function 
NativeModules.TestModule.closewithresult(654.532); 
3

Belki de ne yapmak istediğinizi anlayamıyorum .. ancak yerel bir modül oluşturamıyor ve verileri yerel kodunuza iletmek için tamamlandığında yerel işlevlere tepki veremiyorsunuz. ?

Uygulamanızın, kullanıcının adını ve soyadını girdi olarak alan Yerel Bir bölümünü aldığınızı ve gönderim yaptıklarını varsayalım.

RN javascript'inizi normal olarak kodlarsınız: 2 TextInput alanlarını kendi değerleriyle eşleştirdik ve onPress işleyicili bir Düğme. Başladığınız etkinlikten bir sonuç alabilmek için

public class RCTNameSubmission extends ReactContextBaseJavaModule { 

    public RCTNameSubmission(ReactApplicationContext reactContext) { 
     super(reactContext); 
    } 

    @Override 
    public String getName() { 
     return "NameSubmission"; 
    } 

    @ReactMethod 
    public void submitName(String firstName, String lastName) { 
     // save the name data for later use 
     ... 
     // Exit React App 
     getCurrentActivity().finish(); 
    } 
} 
+0

Bunun iyi bir parça olduğunu düşünüyorum, ancak NativeNameSubmission öğesini çağırdığınızda Rastgele Native uygulamasını kapatmak istiyorum.submitName() 've sonuçta (' firstName' ve 'lastName' örneğinizde) React Native uygulama etkinliğinin anlatımından sorumlu olan etkinlik içinde kullanın. – Marc

+0

RN Etkinliğini bir amaç ile başlatın ve başlattı Etkinleştirme etkinliğini onActivityResult için dinleyin. RN uygulamasını modülden (getCurrentActivity(). Finish();) kapatmak için kodu ekledim. Modülde, verileri daha sonra kullanmak üzere orijinal etkinlikle kaydedebilir veya onActivityResult uygulamasına geri aktarabilirsiniz. –