Để có được một kết quả trở lại từ hoạt động bạn bắt đầu , mô-đun của bạn cần có quyền truy cập vào tham chiếu về hoạt động của bạn.
Dưới đây là hai giải pháp:
- Khai báo các module như một lớp bên trong của hoạt động
- Vượt qua một tham chiếu hoạt động của bạn trong các nhà xây dựng của các mô-đun
Nhưng, hãy nhớ rằng mô-đun của bạn cần phải được sử dụng trong một ReactPackage
và ReactPackage
là một giao diện, vì vậy nếu bạn muốn, bạn có thể có ReactActivity của mình triển khai giao diện (thay vì tạo một lớp mới).
Dưới đây là một ví dụ làm việc đầy đủ sử dụng một inner class
và một hoạt động thực hiện ReactPackage
:
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);
}
}
Sau đó, bạn có thể bắt đầu của bạn ReactActivity
như thế này:
Intent intent = new Intent(getApplicationContext(), MyReactActivity.class);
startActivityForResult(intent, 123);
Lấy kết quả như thế này:
@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"
}
}
Và jus t sử dụng nó trong React:
import { NativeModules } from 'react-native';
// [...]
// Call the function
NativeModules.TestModule.closewithresult(654.532);
Tôi không giỏi với mã gốc nhưng bạn không thể chạy phương pháp gốc mới với dữ liệu mong muốn làm tham số? – bennygenel
Tôi nghĩ bạn nên tham khảo 'ý định android' để đạt được mục tiêu của bạn, sử dụng ý định bên trong java của bạn để kéo phản ứng của bạn lên, sau đó trở lại với kết quả https://facebook.github.io/react-native/releases/0.21/docs /intentandroid.html –