react-native-navigation的迁移库

RnnToolBar.java 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package com.reactnativenavigation.views;
  2. import android.content.Context;
  3. import android.graphics.drawable.Drawable;
  4. import android.os.AsyncTask;
  5. import android.support.v7.widget.Toolbar;
  6. import android.util.AttributeSet;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import com.reactnativenavigation.activities.BaseReactActivity;
  10. import com.reactnativenavigation.core.objects.Button;
  11. import com.reactnativenavigation.core.objects.Screen;
  12. import com.reactnativenavigation.utils.ContextProvider;
  13. import java.lang.ref.WeakReference;
  14. import java.util.Collections;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. /**
  19. * Created by guyc on 09/04/16.
  20. */
  21. public class RnnToolBar extends Toolbar {
  22. private List<Screen> mScreens;
  23. private AsyncTask mSetupToolbarTask;
  24. public RnnToolBar(Context context) {
  25. super(context);
  26. }
  27. public RnnToolBar(Context context, AttributeSet attrs) {
  28. super(context, attrs);
  29. }
  30. public RnnToolBar(Context context, AttributeSet attrs, int defStyleAttr) {
  31. super(context, attrs, defStyleAttr);
  32. }
  33. public void setScreens(List<Screen> screens) {
  34. mScreens = screens;
  35. }
  36. public void handleOnCreateOptionsMenuAsync() {
  37. setupToolbarButtonsAsync(mScreens.get(0));
  38. }
  39. public void setupToolbarButtonsAsync(Screen screen) {
  40. if (mSetupToolbarTask == null) {
  41. mSetupToolbarTask = new SetupToolbarButtonsTask(this, screen).execute();
  42. }
  43. }
  44. @SuppressWarnings({"ConstantConditions"})
  45. public void showBackButton() {
  46. ContextProvider.getActivityContext().getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  47. }
  48. @SuppressWarnings({"ConstantConditions"})
  49. public void hideBackButton() {
  50. ContextProvider.getActivityContext().getSupportActionBar().setDisplayHomeAsUpEnabled(false);
  51. }
  52. private static class SetupToolbarButtonsTask extends AsyncTask<Void, Void, Map<String, Drawable>> {
  53. private final List<Button> mButtons;
  54. private final WeakReference<RnnToolBar> mToolbarWR;
  55. public SetupToolbarButtonsTask(RnnToolBar toolBar, Screen newScreen) {
  56. mToolbarWR = new WeakReference<>(toolBar);
  57. mButtons = newScreen.buttons == null ? Collections.EMPTY_LIST : newScreen.buttons;
  58. }
  59. @Override
  60. protected Map<String, Drawable> doInBackground(Void... params) {
  61. Context context = ContextProvider.getActivityContext();
  62. if (context == null) {
  63. return null;
  64. }
  65. Map<String, Drawable> icons = new HashMap<>();
  66. for (Button button : mButtons) {
  67. if (button.hasIcon()) {
  68. icons.put(button.id, button.getIcon(context));
  69. }
  70. }
  71. return icons;
  72. }
  73. @Override
  74. protected void onPostExecute(Map<String, Drawable> icons) {
  75. Context context = ContextProvider.getActivityContext();
  76. if (context == null) {
  77. return;
  78. }
  79. Menu menu = ((BaseReactActivity) context).getMenu();
  80. // Add new screen buttons
  81. int i;
  82. for (i = 0; i < mButtons.size(); i++) {
  83. Button button = mButtons.get(i);
  84. MenuItem item = menu.add(Menu.NONE, button.getItemId(), i, button.title);
  85. if (icons.containsKey(button.id)) {
  86. Drawable icon = icons.get(button.id);
  87. item.setIcon(icon).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
  88. }
  89. }
  90. // Remove prev screen buttons
  91. for (int j = i; j < menu.size(); j++) {
  92. menu.removeItem(j);
  93. }
  94. RnnToolBar toolBar = mToolbarWR.get();
  95. if (toolBar != null) {
  96. toolBar.mSetupToolbarTask = null;
  97. mToolbarWR.clear();
  98. }
  99. }
  100. }
  101. }