react-native-navigation的迁移库

ContentView.java 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package com.reactnativenavigation.views;
  2. import android.content.Context;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import com.facebook.react.ReactRootView;
  6. import com.reactnativenavigation.NavigationApplication;
  7. import com.reactnativenavigation.params.NavigationParams;
  8. import com.reactnativenavigation.screens.SingleScreen;
  9. import com.reactnativenavigation.utils.ViewUtils;
  10. import com.reactnativenavigation.views.utils.ViewMeasurer;
  11. public class ContentView extends ReactRootView {
  12. private final String screenId;
  13. private final NavigationParams navigationParams;
  14. private Bundle initialProps;
  15. boolean isContentVisible = false;
  16. private SingleScreen.OnDisplayListener onDisplayListener;
  17. protected ViewMeasurer viewMeasurer;
  18. public void setOnDisplayListener(SingleScreen.OnDisplayListener onDisplayListener) {
  19. this.onDisplayListener = onDisplayListener;
  20. }
  21. public ContentView(Context context, String screenId, NavigationParams navigationParams) {
  22. this(context, screenId, navigationParams, Bundle.EMPTY);
  23. }
  24. public ContentView(Context context, String screenId, NavigationParams navigationParams, Bundle initialProps) {
  25. super(context);
  26. this.screenId = screenId;
  27. this.navigationParams = navigationParams;
  28. this.initialProps = initialProps;
  29. attachToJS();
  30. viewMeasurer = new ViewMeasurer();
  31. }
  32. public void setViewMeasurer(ViewMeasurer viewMeasurer) {
  33. this.viewMeasurer = viewMeasurer;
  34. }
  35. private void attachToJS() {
  36. navigationParams.toBundle().putAll(initialProps);
  37. startReactApplication(NavigationApplication.instance.getReactGateway().getReactInstanceManager(),
  38. screenId,
  39. createInitialParams()
  40. );
  41. }
  42. private Bundle createInitialParams() {
  43. final Bundle params = new Bundle();
  44. params.putAll(navigationParams.toBundle());
  45. params.putAll(initialProps);
  46. return params;
  47. }
  48. public String getNavigatorEventId() {
  49. return navigationParams.navigatorEventId;
  50. }
  51. public void unmountReactView() {
  52. unmountReactApplication();
  53. }
  54. @Override
  55. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  56. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  57. int measuredHeight = viewMeasurer.getMeasuredHeight(heightMeasureSpec);
  58. setMeasuredDimension(viewMeasurer.getMeasuredWidth(widthMeasureSpec), measuredHeight);
  59. }
  60. @Override
  61. public void onViewAdded(final View child) {
  62. super.onViewAdded(child);
  63. detectContentViewVisible(child);
  64. }
  65. private void detectContentViewVisible(View child) {
  66. if (onDisplayListener != null) {
  67. ViewUtils.runOnPreDraw(child, new Runnable() {
  68. @Override
  69. public void run() {
  70. if (!isContentVisible) {
  71. isContentVisible = true;
  72. onDisplayListener.onDisplay();
  73. onDisplayListener = null;
  74. }
  75. }
  76. });
  77. }
  78. }
  79. }