2017-02-03 6 views
1

私は、ボタンをクリックするとフラグメントBが始まり、RecyclerViewを含むフラグメントAを持っています。断片Bでは、アイテムEventBusのクリックで開始され、その値は、フラグメントAに渡される必要がある。しかし、何らかの理由で、値がイベントバスイベントはフラグメントに決して到達しません

フラグメントA

public class OrderSummaryFragment extends BaseFragment implements OrderSummaryView { 
    private static final String ARG_PARAM1 = "param1"; 
    public static final String ACTION_BACK = OrderSummaryFragment.class.getName() + ".back"; 
    public static final String ACTION_HIDE_ACTION_BAR = OrderSummaryFragment.class.getName() + ".hide_action_bar"; 
    public static final String ACTION_SHOW_ACTION_BAR = OrderSummaryFragment.class.getName() + ".show_action_bar"; 
    public static final String ACTION_CHANGE_ADDRESS = OrderSummaryFragment.class.getName() + ".select_address"; 

    FragmentOrderSummaryBinding mBinder; 
    Shop mShop; 
    OrderSummaryPresenter mPresenter; 

    public OrderSummaryFragment() { 

    } 

    public static OrderSummaryFragment newInstance(Shop shop) { 
     OrderSummaryFragment fragment = new OrderSummaryFragment(); 
     Bundle args = new Bundle(); 
     args.putParcelable(ARG_PARAM1, Parcels.wrap(shop)); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      Parcelable parcelable; 
      parcelable = getArguments().getParcelable(ARG_PARAM1); 
      mShop = Parcels.unwrap(parcelable); 
     } 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_order_summary, container, false); 
     mPresenter = new OrderSummaryPresenterImpl(this); 
     sendActionToActivity(ACTION_HIDE_ACTION_BAR); 
     setUIListeners(); 
     EventBus.getDefault().register(this); 
     return mBinder.getRoot(); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     mPresenter.loadBillingAddress(mShop); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     sendActionToActivity(ACTION_SHOW_ACTION_BAR); 
     EventBus.getDefault().unregister(this); 
     mPresenter.cleanup(); 
    } 

    @Override 
    protected void setTypeface() { 
     mBinder.tvBackButton.setTypeface(FontManager.getInstance().getFontAwesome()); 
    } 

    private void setUIListeners() { 
     mBinder.tvBackButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       sendActionToActivity(ACTION_BACK); 
      } 
     }); 
     mBinder.btnChange.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       sendActionToActivity(ACTION_CHANGE_ADDRESS, mShop); 
      } 
     }); 
    } 

    @Override 
    public void renderBillingAddress(UserInfo userInfo) { 
     mBinder.setUserInfo(userInfo); 
     if (userInfo.getAddress2().equals("")) { 
      mBinder.tvBillingAddress2.setVisibility(View.GONE); 
     } 
    } 

    @Override 
    public void renderPaymentTerms(List<PaymentInfo> paymentInfoList) { 

    } 

    @Override 
    public void renderDeliveryMethod(List<DeliveryInfo> deliveryInfoList) { 

    } 

    @Override 
    public void showProgress(boolean show) { 

    } 

    @Override 
    public void showError(Error error) { 

    } 

    private void sendActionToActivity(String action) { 
     if (mListener == null) { 
      return; 
     } 
     Bundle bundle = new Bundle(); 
     bundle.putString(Constants.ACTION_KEY, action); 
     mListener.onFragmentInteraction(bundle); 
    } 

    private void sendActionToActivity(String action, Shop shop) { 
     if (mListener == null) { 
      return; 
     } 
     Bundle bundle = new Bundle(); 
     bundle.putString(Constants.ACTION_KEY, action); 
     bundle.putParcelable(Constants.DATA_KEY_1, Parcels.wrap(shop)); 
     mListener.onFragmentInteraction(bundle); 
    } 

    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void onMessage(ShippingAddressResult event) { 
     UserInfo userInfo = event.getUserInfo(); 
     Log.d("Tag", "Test" + userInfo); 
    } 
} 
フラグメントAに達することはありません

断片B

public class ShippingAddressFragment extends BaseFragment implements ShippingAddressView, 
     ShippingAddressAdapter.OnItemInteractionListener { 
    private static final String ARG_PARAM1 = "param1"; 
    public static final String ACTION_BACK = ShippingAddressFragment.class.getName() + ".back"; 
    public static final String ACTION_HIDE_ACTION_BAR = ShippingAddressFragment.class.getName() + ".hide_action_bar"; 
    public static final String ACTION_SHOW_ACTION_BAR = ShippingAddressFragment.class.getName() + ".show_action_bar"; 
    public static final String ACTION_NEW_ADDRESS = ShippingAddressFragment.class.getName() + ".new_address"; 

    FragmentShippingAddressBinding mBinder; 
    Shop mShop; 
    ShippingAddressAdapter mAdapter; 
    ShippingAddressPresenterImpl mPresenter; 
    List<UserInfo> mUserInfoList; 

    public ShippingAddressFragment() { 

    } 

    public static ShippingAddressFragment newInstance(Shop shop) { 
     ShippingAddressFragment fragment = new ShippingAddressFragment(); 
     Bundle args = new Bundle(); 
     args.putParcelable(ARG_PARAM1, Parcels.wrap(shop)); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      Parcelable parcelable; 
      parcelable = getArguments().getParcelable(ARG_PARAM1); 
      mShop = Parcels.unwrap(parcelable); 
     } 
     mUserInfoList = new ArrayList<>(); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_shipping_address, container, false); 
     setUIListener(); 
     mPresenter = new ShippingAddressPresenterImpl(this); 
     sendActionToActivity(ACTION_HIDE_ACTION_BAR); 
     mAdapter = new ShippingAddressAdapter(getContext(), mUserInfoList); 
     mAdapter.addOnInteractionListener(this); 
     LinearLayoutManager manager = new LinearLayoutManager(getContext()); 
     mBinder.rvShippingAddress.setLayoutManager(manager); 
     mBinder.rvShippingAddress.addItemDecoration(new DividerItemDecoration(getActivity())); 
     mBinder.rvShippingAddress.setAdapter(mAdapter); 
     return mBinder.getRoot(); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     mPresenter.loadShippingAddress(mShop); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     mPresenter.cleanup(); 
     sendActionToActivity(ACTION_SHOW_ACTION_BAR); 
     mAdapter.removeInteractionListener(); 
    } 

    @Override 
    protected void setTypeface() { 
     mBinder.tvBackButton.setTypeface(FontManager.getInstance().getFontAwesome()); 
    } 

    private void setUIListener() { 
     mBinder.tvBackButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       sendActionToActivity(ACTION_BACK); 
      } 
     }); 
     mBinder.fabNewAddress.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       sendActionToActivity(ACTION_NEW_ADDRESS, mShop); 
      } 
     }); 
    } 

    @Override 
    public void onClick(UserInfo userInfo) { 
     selectedShippingAddress(userInfo); 
     sendActionToActivity(ACTION_BACK); 
    } 

    @Override 
    public void renderShippingAddress(List<UserInfo> userInfoList) { 
     mUserInfoList.clear(); 
     mUserInfoList.addAll(userInfoList); 
     mAdapter.notifyDataSetChanged(); 
    } 

    private void sendActionToActivity(String action) { 
     if (mListener == null) { 
      return; 
     } 
     Bundle bundle = new Bundle(); 
     bundle.putString(Constants.ACTION_KEY, action); 
     mListener.onFragmentInteraction(bundle); 
    } 

    private void sendActionToActivity(String action, Shop shop) { 
     if (mListener == null) { 
      return; 
     } 
     Bundle bundle = new Bundle(); 
     bundle.putString(Constants.ACTION_KEY, action); 
     bundle.putParcelable(Constants.DATA_KEY_1, Parcels.wrap(shop)); 
     mListener.onFragmentInteraction(bundle); 
    } 

    private void sendActionToActivity(String action, Shop shop, AllCheckoutInfo allCheckoutInfo) { 
     if (mListener == null) { 
      return; 
     } 
     Bundle bundle = new Bundle(); 
     bundle.putString(Constants.ACTION_KEY, action); 
     bundle.putParcelable(Constants.DATA_KEY_1, Parcels.wrap(shop)); 
     bundle.putParcelable(Constants.DATA_KEY_2, Parcels.wrap(allCheckoutInfo)); 
     mListener.onFragmentInteraction(bundle); 
    } 

    @Override 
    public void showProgress(final boolean show) { 

    } 

    @Override 
    public void showError(Error error) { 

    } 

    private void selectedShippingAddress(UserInfo userInfo) { 
     ShippingAddressResult event; 
     event = new ShippingAddressResult(); 
     event.setUserInfo(userInfo); 
     EventBus.getDefault().post(event); 
    } 
} 
+0

onResumeであなたのイベントバスを登録することは常に良いです()の代わりのonCreate()と登録解除のそれはonDestroy()にあります。フラグメントAをフラグメントBに置き換える場合は、フラグメントAのonDestroy()が呼び出されます。これは、フラグメントとイベントのEventBusの登録を抹消しません。 – nnn

+0

私は 'onResume()'に配置しようとしましたが、それでも動作しません。 – Esteban

+0

フラグメントAのDestroyにログを出力します。追加する代わりにフラグメントを置き換えていると思います。その結果、フラグメントAのonDestroy()が呼び出され、フラグメントBに移動します。そのため、フラグメントAはもはやイベント。 – nnn

答えて

4

フラグメントAをフラグメントBに置き換えるので、イベントが発生すると、フラグメントAはそれをキャッチするために生存/登録されていません。定期的なイベントでは、ユーザーが解雇された瞬間に加入者を探し、その後死ぬ。その時点でそのイベントのサブスクライバが存在する場合、そのイベントを受信します。これはスティッキーイベントが救助に来るところです。スティッキーイベントは「スティック」します。ポスト・モメンタリの後にスティッキー・イベントに加入しても(スティッキーに)加入者がそれを取得します。このためには、次のようにします。

EventBus.getDefault().postSticky(event);

EventBus.getDefault().post(event);を交換し、あなたのShippingAdressResultのサブスクリプションがスティッキーます

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) 
public void onMessage(ShippingAddressResult event) { 
    UserInfo userInfo = event.getUserInfo(); 
    Log.d("Tag", "Test" + userInfo); 
    EventBus.getDefault().removeStickyEvent(stickyEvent); // don't forget to remove the sticky event if youre done with it 
} 

More Info

+0

ありがとうございました! – Esteban

1

私はSticky Eventは何が必要だと思います。イベントを消費するサブスクライバがいない場合は、サブスクライブするまで待機します。あなたが断片を置き換えているときのあなたの状況かもしれません。

EventBus.getDefault().postSticky(event); 

このイベントがもう必要ない場合は、それを削除することを忘れないでください。

EventBus.getDefault().removeStickyEvent(stickyEvent); 

幸運!

+1

過去のイベントの送信を受け取るには、コンシューマーも購読する必要があります(sticky = true) –

関連する問題