0

我想通过一个活动将一个值传递给片段EventBus。我可以传递值并使用方法读取@Subscribe。但是我不能将值传递给 onCreateView 开头的变量 - setupGridView(mUser)。我想将该值添加setupGridView为参数。是否有可能在一开始就获取 EventBus 数据onCreateView()

private User mUser;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_profile_pages, container, false);
  setupGridView(mUser);// mUser is null here
}

@Subscribe
public void mSetUser(User user){
  mUser = user;       
  Log.d(TAG, "mUser: " + user.toString());//I can see data here
}

@Override
public void onAttach(Context context) {
  EventBus.getDefault().register(this);
  super.onAttach(context);
}

@Override
public void onDetach() {
  super.onDetach();
  EventBus.getDefault().unregister(this);
}
4

1 回答 1

0

不,您不能将值传递给,onCreateView()因为当您触发要接收的事件时,onCreateView()它会太早或太晚。

这是解释:

片段生命周期从片段添加到活动开始。该片段通常添加以下代码:

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

让我们将上面的代码变成一个名为 addExampleFragment() 的方法。所以,它看起来像这样:

private void addExampleFragment() {
  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

  ExampleFragment fragment = new ExampleFragment();
  fragmentTransaction.add(R.id.fragment_container, fragment);
  fragmentTransaction.commit();
}

现在,因为我们想要onCreateView()接收Event,我们认为我们可以在添加 Fragment 之前发送它:

// this is just an example of event.
// tell the subscriber about the user value.
EventBus.getDefault.post(new UserValueEvent("value");

// create the fragment
addExampleFragment()

但它不起作用,因为 Fragment 尚未创建,因此它不会将自己注册为订阅者。发送事件为时过早。

如果我们想在创建片段后发送事件:

// create the fragment
addExampleFragment()

// tell the subscriber about the user value.
EventBus.getDefault.post(new UserValueEvent("value");

它也不会工作,因为在Event被触发onCreateView()之前已经被调用。因此,发送事件为时已晚。

因此,您不能使用 Event 来解决您的onCreateView()问题。您可以改用Bundle

于 2017-10-29T16:51:58.787 回答