Android 碎片';s onCreateView不';不保存成员引用
我有一个Android 碎片';s onCreateView不';不保存成员引用,android,android-fragments,android-lifecycle,otto,Android,Android Fragments,Android Lifecycle,Otto,我有一个main活动,带有ViewPager。ViewPager由两个片段组成,每个片段都包含一个RecyclerView。我需要参考片段中的回收视图,以便对其进行更新/设置动画等 屏幕旋转时出现问题,因为出于某种原因,我无法将成员变量设置回RecyclerView public abstract class NotifListFragment extends Fragment { protected RecyclerView mRecyclerView; public No
main活动
,带有ViewPager
。ViewPager
由两个片段组成,每个片段都包含一个RecyclerView
。我需要参考片段中的回收视图
,以便对其进行更新/设置动画等
屏幕旋转时出现问题,因为出于某种原因,我无法将成员变量设置回RecyclerView
public abstract class NotifListFragment extends Fragment {
protected RecyclerView mRecyclerView;
public NotifListFragment() {
// Required empty public constructor
EventBusHelper.getBus().register(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mRecyclerView = (RecyclerView) inflater.inflate(R.layout.fragment_notif_list, container, false);
setupRecyclerView(mRecyclerView);
return mRecyclerView;
}
因此,在这里的onCreateView
中,我总是膨胀片段并将引用保存在mRecyclerView
变量中。但是,当我稍后尝试访问它时,它是空的
我使用调用这两个Fragment
的onDataChanged()
方法。当按下RecyclerView
中的按钮时,将调用该函数
@Subscribe
public void onDataChanged(DataChangedEvent event) {
List<CustomNotification> oldData = ((NotifRecyclerViewAdapter) mRecyclerView.getAdapter()).getmValues();
List<CustomNotification> newData = getNotifications();
}
@订阅
公共无效onDataChanged(DataChangedEvent事件){
List oldData=((NotifRecycleServiceAdapter)mRecyclerView.getAdapter()).getmValues();
List newData=getNotifications();
}
mRecyclerView.getAdapter()
在此调用中为空
片段的getView()
也返回null。发生了什么事?我在这里发现了一些错误。请不要调用setupRecyclerView(mRecyclerView)
在您的onCreateView()
中,这是应该在您的activityCreated()
上调用的内容,因为在此之前您的片段可能尚未附加到您的活动。另外,我不喜欢在那里做findviewbyds
使用和回调。
所以你的代码看起来像这样
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_notif_list, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mRecycler = (RecyclerView) view.findViewById(R.id.yourId);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
setupRecyclerView(mRecycler);
}
在调用onDataChanged()
的过程中,可能没有添加片段。在那里做一个空检查 我在这里发现了一些错误。请不要调用setupRecyclerView(mRecyclerView)
在您的onCreateView()
中,这是应该在您的activityCreated()
上调用的内容,因为在此之前您的片段可能尚未附加到您的活动。另外,我不喜欢在那里做findviewbyds
使用和回调。
所以你的代码看起来像这样
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_notif_list, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mRecycler = (RecyclerView) view.findViewById(R.id.yourId);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
setupRecyclerView(mRecycler);
}
在调用onDataChanged()
的过程中,可能没有添加片段。在那里做一个空检查 “当我以后尝试访问它时”是什么意思?我编辑了这个问题您如何确定onCreateView之后调用onDataChanged?每次调用onCreateView()时,我都会记录。我旋转屏幕,在日志中我可以看到onCreateView()被调用,并且mRecyclerView不为null。然后单击应用程序中的一个按钮。在这一点上,它崩溃了,mRecyclerView突然设置为null。好吧,我的错。当调用onDestroyView()时,我也应该取消注册,因为似乎每次旋转都会注册两个以上的片段来接收消息,以及旧的片段。而旧的没有任何布局,所以他们抛出错误。对不起,“当我稍后尝试访问它时”是什么意思?我编辑了这个问题您如何确定onDataChanged在onCreateView之后被调用?每次调用onCreateView()时,我都会记录。我旋转屏幕,在日志中我可以看到onCreateView()被调用,并且mRecyclerView不为null。然后单击应用程序中的一个按钮。在这一点上,它崩溃了,mRecyclerView突然设置为null。好吧,我的错。当调用onDestroyView()时,我也应该取消注册,因为似乎每次旋转都会注册两个以上的片段来接收消息,以及旧的片段。而旧的没有任何布局,所以他们抛出错误。很抱歉