片段在 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?

多次调用片段 onCreateView

onCreateView()没有第二次调用

Android 片段 onCreateView 与 onActivityCreated

Android Java:在 onCreateView() 中返回空视图的片段