片段的onCreateView不会保存成员引用

时间:2015-08-21 10:24:06

标签: android android-fragments android-lifecycle otto

我有MainActivity ViewPagerViewPager由两个Fragments组成,每个RecyclerView持有一个RecyclerView。我需要在Fragment中引用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变量中保存引用。但是,当我稍后尝试访问它时,它为空。

我正在使用Otto来同时调用onDataChanged()&#39 {s} RecyclerView方法。当按下@Subscribe public void onDataChanged(DataChangedEvent event) { List<CustomNotification> oldData = ((NotifRecyclerViewAdapter) mRecyclerView.getAdapter()).getmValues(); List<CustomNotification> newData = getNotifications(); } 中的按钮时调用它。

mRecyclerView.getAdapter()

此调用中getView()为空。

Fragment&#39; template <class T> SearchType findChild(QQuickItem* object, const QString& objectName) { QList<QQuickItem*> children = object->childItems(); foreach (QQuickItem* item, children) { if (QQmlProperty::read(item, "objectName").toString() == objectName) return item; T child = findChild<QQuickItem*>(item, objectName); if (child) return child; } return nullptr; } 也返回null。发生了什么事?

1 个答案:

答案 0 :(得分:0)

我发现有些事情在这里错了。请不要在setupRecyclerView(mRecyclerView);中致电onCreateView(),这应该在activityCreated()上调用,因为在此之前您的片段可能尚未附加到您的活动中。另外,我不喜欢在那里做findViewByIds

使用onViewCreated()onActivityCreated()回调。 所以你的代码看起来像这样。

@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()期间可能没有添加该片段。在那里做一个空检查。