react-native-navigation的迁移库

FragmentScreen.java 4.5KB

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