片段在 onCreateView() 中的 recyclerView 上被赋予空值
Posted
技术标签:
【中文标题】片段在 onCreateView() 中的 recyclerView 上被赋予空值【英文标题】:Fragment is given a null on recyclerView in onCreateView() 【发布时间】:2018-12-28 13:47:54 【问题描述】:基于一个活动和一些片段的应用程序。 当片段启动时应用程序崩溃并显示日志:
java.lang.RuntimeException: Unable to start activity ComponentInforu.alexsuvorov.paistewiki/ru.alexsuvorov.paistewiki.StartDrawer: java.lang.NullPointerException
...
Caused by: java.lang.NullPointerException
at ru.alexsuvorov.paistewiki.Fragment.NewsFragment.onCreateView(NewsFragment.java:42)
我只是初始化了一些数组位置并尝试显示它
现在我编辑代码
public class NewsFragment extends Fragment
private static final String TAG = "NewsFragment";
private ImageSliderAdapter sliderAdapter;
private List<NewsMonth> monthArray;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
return inflater.inflate(R.layout.news_fragment, container, false);
@Override
public void onViewCreated(@NonNull View view,
Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
ViewPager viewPager = view.findViewById(R.id.view_pager);
sliderAdapter = new ImageSliderAdapter(getContext());
viewPager.setAdapter(sliderAdapter);
initializeData();
RecyclerView recyclerView = view.findViewById(R.id.newsList);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(llm);
NewsAdapter adapter = new NewsAdapter(monthArray); /*this.getContext(), R.layout.news_item, monthArray*/
recyclerView.setAdapter(adapter);
private void initializeData()
monthArray = new ArrayList<>();
monthArray.add(new NewsMonth("www.ya.ru", "Январь", null));
monthArray.add(new NewsMonth("www.on.ru", "Февраль", null));
monthArray.add(new NewsMonth("www.ti.ru", "Март", null));
我的 XML 文件 - 回收列表和卡片项目: ... …… ...
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/newsLayout"
android:layout_
android:layout_
android:layout_margin="8dp"
android:orientation="vertical"
android:padding="8dp">
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
layout_constraintEnd_toStartOf="@+id/newsList"
android:layout_
android:layout_
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</android.support.v4.view.ViewPager>
<ScrollView
android:id="@+id/newsScroll"
android:layout_
android:layout_
android:paddingEnd="@dimen/fab_margin"
app:layout_anchor="@+id/view_pager"
app:layout_anchorGravity="bottom"
app:layout_constraintTop_toBottomOf="@id/view_pager"
tools:layout_constraintTop_toBottomOf="@+id/view_pager"
android:paddingRight="@dimen/fab_margin">
<android.support.v7.widget.RecyclerView
android:id="@+id/newsList"
android:layout_
android:layout_
android:gravity="top|bottom|left|right"
android:orientation="vertical"
app:layout_anchor="@+id/view_pager"
app:layout_anchorGravity="bottom|center"
app:layout_constraintTop_toBottomOf="@id/view_pager"
tools:layout_editor_absoluteX="3dp"
tools:layout_editor_absoluteY="112dp">
</android.support.v7.widget.RecyclerView>
</ScrollView>
和卡片项目: 几个字符的文本,这样堆栈溢出就不会发誓 几个字符的文本,这样堆栈溢出就不会发誓 几个字符的文本,这样堆栈溢出就不会发誓 几个字符的文字,这样堆栈溢出就不骂了
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cv"
android:layout_
android:layout_
android:layout_marginBottom="8dp"
android:background="@color/black"
app:cardCornerRadius="8dp"
app:cardUseCompatPadding="true"
app:contentPadding="0dp">
<RelativeLayout
android:layout_
android:layout_
android:padding="16dp">
<TextView
android:id="@+id/news_label"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginTop="5dp"
android:background="@color/colorAccent"
tools:text="Who is.. James bond??!" />
<TextView
android:id="@+id/news_category"
android:layout_
android:layout_
android:layout_alignBaseline="@+id/news_label"
android:layout_alignBottom="@+id/news_label"
android:layout_toEndOf="@+id/news_label"
android:layout_toRightOf="@+id/news_label"
android:background="@android:color/holo_green_light"
tools:text="Artist" />
</RelativeLayout>
<TextView
android:id="@+id/month_name"
android:layout_
android:layout_
android:layout_alignParentTop="true"
android:background="@color/colorPrimaryDark"
android:fontFamily="sans-serif-condensed"
android:gravity="center"
android:textSize="16sp"
android:textStyle="bold"
tools:text="Июнь" />
【问题讨论】:
【参考方案1】:不要在 OnCreateView 中编写 findViewById() 语句。 仅使用 OnCreateView() 来膨胀视图。 在 OnViewCreated() 方法中编写 findViewById() 方法,该方法会在视图创建完成后立即调用。 通过在 onCreateView() 中编写 findViewById(),您试图在容器 View 仍在创建过程中查找视图,并且您的视图可能尚未创建,这会导致返回 null。
【讨论】:
同样的错误。我正在编辑 onCreate,现在只有膨胀布局 @AlexSuvorov 你能指出代码中的第 42 行到底是什么吗? recyclerView.setLayoutManager(llm); 它没有帮助。可能是 XML 的问题? 下班回到家,开始在普通电脑上工作,一切正常,谢谢以上是关于片段在 onCreateView() 中的 recyclerView 上被赋予空值的主要内容,如果未能解决你的问题,请参考以下文章
替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段
完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?