我无法在Fragment onCreateView中获取EventBus数据

时间:2017-10-29 13:39:11

标签: android greenrobot-eventbus-3.0

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

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);
}

1 个答案:

答案 0 :(得分: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()收到事件,我们认为我们可以在添加片段之前发送它:

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

// create the fragment
addExampleFragment()

但它不会起作用,因为片段尚未创建,因此它不会将自己注册为订阅者。发送活动还为时过早。

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

// create the fragment
addExampleFragment()

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

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

因此,您无法使用事件来解决onCreateView()问题。您可以改用捆绑