我想通过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);
}
答案 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()
问题。您可以改用捆绑。