react-native-navigation的迁移库

FragmentScreen.java 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package com.reactnativenavigation.screens;
  2. import android.app.Fragment;
  3. import android.app.FragmentManager;
  4. import android.app.FragmentTransaction;
  5. import android.os.Bundle;
  6. import android.support.annotation.Nullable;
  7. import android.support.v7.app.AppCompatActivity;
  8. import android.widget.FrameLayout;
  9. import com.reactnativenavigation.R;
  10. import com.reactnativenavigation.params.ScreenParams;
  11. import com.reactnativenavigation.utils.ViewUtils;
  12. import com.reactnativenavigation.views.ContentView;
  13. import com.reactnativenavigation.views.LeftButtonOnClickListener;
  14. import java.lang.reflect.InvocationTargetException;
  15. import java.lang.reflect.Method;
  16. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  17. @SuppressWarnings("ResourceType")
  18. public class FragmentScreen extends Screen {
  19. private static final String CONTRACT_GET_FRAGMENT = "getFragment";
  20. private static final String CONTRACT_GET_SUPPORT_FRAGMENT = "getSupportFragment";
  21. private FrameLayout content;
  22. public FragmentScreen(AppCompatActivity activity, ScreenParams screenParams, LeftButtonOnClickListener leftButtonOnClickListener) {
  23. super(activity, screenParams, leftButtonOnClickListener);
  24. }
  25. @Override
  26. protected void createContent() {
  27. content = new FrameLayout(getContext());
  28. content.setId(R.id.fragment_screen_content);
  29. addContent();
  30. addFragment();
  31. }
  32. private void addContent() {
  33. ContentView contentView = new ContentView(getContext(),
  34. screenParams.screenId,
  35. screenParams.navigationParams);
  36. addView(contentView, 0, 0);
  37. LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  38. if (screenParams.styleParams.drawScreenBelowTopBar) {
  39. params.addRule(BELOW, topBar.getId());
  40. }
  41. addView(content, params);
  42. }
  43. private void addFragment() {
  44. try {
  45. Fragment fragment = tryGetFragment();
  46. if (fragment != null) {
  47. addFragment(fragment);
  48. return;
  49. }
  50. android.support.v4.app.Fragment supportFragment = tryGetSupportFragment();
  51. if (supportFragment != null) {
  52. addSupportFragment(supportFragment);
  53. return;
  54. }
  55. throw new RuntimeException("must provide public static method " + CONTRACT_GET_FRAGMENT + " or " + CONTRACT_GET_SUPPORT_FRAGMENT);
  56. } catch (Exception e) {
  57. throw new RuntimeException(e);
  58. }
  59. }
  60. private void addFragment(Fragment fragment) {
  61. FragmentManager fm = activity.getFragmentManager();
  62. FragmentTransaction transaction = fm.beginTransaction();
  63. transaction.add(R.id.fragment_screen_content, fragment);
  64. transaction.commit();
  65. }
  66. private void addSupportFragment(android.support.v4.app.Fragment supportFragment) {
  67. android.support.v4.app.FragmentManager fm = activity.getSupportFragmentManager();
  68. android.support.v4.app.FragmentTransaction transaction = fm.beginTransaction();
  69. transaction.add(R.id.fragment_screen_content, supportFragment);
  70. transaction.commit();
  71. }
  72. @Nullable
  73. private Fragment tryGetFragment() throws ClassNotFoundException, IllegalAccessException, InvocationTargetException {
  74. try {
  75. String className = screenParams.fragmentCreatorClassName;
  76. Class<?> fragmentCreatorClass = Class.forName(className);
  77. Method method = fragmentCreatorClass.getMethod(CONTRACT_GET_FRAGMENT, Bundle.class);
  78. return (android.app.Fragment) method.invoke(null, screenParams.fragmentCreatorPassProps);
  79. } catch (NoSuchMethodException noSuchMethod) {
  80. return null;
  81. }
  82. }
  83. @Nullable
  84. private android.support.v4.app.Fragment tryGetSupportFragment() throws ClassNotFoundException, IllegalAccessException, InvocationTargetException {
  85. try {
  86. String className = screenParams.fragmentCreatorClassName;
  87. Class<?> fragmentCreatorClass = Class.forName(className);
  88. Method method = fragmentCreatorClass.getMethod(CONTRACT_GET_SUPPORT_FRAGMENT, Bundle.class);
  89. return (android.support.v4.app.Fragment) method.invoke(null, screenParams.fragmentCreatorPassProps);
  90. } catch (NoSuchMethodException noSuchMethod) {
  91. return null;
  92. }
  93. }
  94. @Override
  95. public void ensureUnmountOnDetachedFromWindow() {
  96. // nothing
  97. }
  98. @Override
  99. public void preventUnmountOnDetachedFromWindow() {
  100. // nothing
  101. }
  102. @Override
  103. public void preventMountAfterReattachedToWindow() {
  104. // nothing
  105. }
  106. @Override
  107. public void setOnDisplayListener(final OnDisplayListener onContentViewDisplayedListener) {
  108. ViewUtils.runOnPreDraw(content, new Runnable() {
  109. @Override
  110. public void run() {
  111. onContentViewDisplayedListener.onDisplay();
  112. }
  113. });
  114. }
  115. }