如何修复Android官方教程中的基本片段示例代码中的错误

如何修复Android官方教程中的基本片段示例代码中的错误,android,android-fragments,Android,Android Fragments,我已经下载了官方片段教程的示例代码,在将其更新为使用gradle并使用最新版本的Android Studio后,我发现当单击文章和在大屏幕模拟器上运行时(即平板电脑大小的屏幕-在手机大小的屏幕上运行时,它会抛出NullPointerException)。您可以找到更新的代码。例外情况是: java.lang.NullPointerException at com.example.fragmentbasics.ArticleFragment.updateArticleView(Articl

我已经下载了官方片段教程的示例代码,在将其更新为使用gradle并使用最新版本的Android Studio后,我发现当单击文章和在大屏幕模拟器上运行时(即平板电脑大小的屏幕-在手机大小的屏幕上运行时,它会抛出NullPointerException)。您可以找到更新的代码。例外情况是:

java.lang.NullPointerException
    at com.example.fragmentbasics.ArticleFragment.updateArticleView(ArticleFragment.java:64)
    at com.example.fragmentbasics.MainActivity.onArticleSelected(MainActivity.java:66)
    at com.example.fragmentbasics.HeadlinesFragment.onListItemClick(HeadlinesFragment.java:75)
    at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:60)
    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
    at android.widget.AbsListView$1.run(AbsListView.java:3463)
    at android.os.Handler.handleCallback(Handler.java:730)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
据我所知,在创建片段ArticleFragment时,layout article_视图应该扩展到主活动中。此版面有一个id为“article”的文本视图。无论屏幕大小如何,都应该发生这种情况

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
    ...

    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.article_view, container, false);
}
但由于某些原因,稍后在ArticleFragment上调用updateArticleView时,找不到id为“article”的视图,这会导致上面的NPE

public void updateArticleView(int position) {
    TextView article = (TextView) getActivity().findViewById(R.id.article);
    article.setText(Ipsum.Articles[position]);
    mCurrentPosition = position;
}
我们需要对示例代码进行哪些更改以避免此NPE,并使示例代码在所有屏幕大小下都能工作

更新:


由于Roberto Martucci在下面的回答,该问题已得到解决。我已经更新了github存储库的主分支以包含修复

因为它是一个片段,所以应该在它的根视图上调用
findviewbyd
,而不是在活动内容上调用。应用这些更改以避免异常:

private View rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  Bundle savedInstanceState) {
    ...

   // Inflate the layout for this fragment
   rootView = inflater.inflate(R.layout.article_view, container, false)
   return rootView;
}

public void updateArticleView(int position) {
    if(rootView != null) {
        TextView article = (TextView) rootView.findViewById(R.id.article);
        article.setText(Ipsum.Articles[position]);
    }
    mCurrentPosition = position;
}
更新

我测试了你的代码,可能找到了解决方案。您必须将
article_view.xml
添加到前面在其他答案中建议的大版面中,但它必须具有以下结构。您的
TextView
需要一个父容器,因此我将其包装在
FrameLayout

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/article"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp"
        android:textSize="18sp" />
</FrameLayout>

检查了一下后,我发现它

您的结构必须如下所示:

layout
   -article_view.xml
   -news_articles.xml
layout-small
   -article_view.xml
layout-large
   -article_view.xml
layout-xlarge
    -article_view.xml
试过了,效果很好


编辑:或任何其他方式,但您必须在所有这些文件夹中拥有
article\u view.xml

这是一个非常小的问题,请检查您的
文章视图。xml
仅适用于
main/res/layout
。如果你想在大屏幕上使用它,那么你必须在
main/res/layout large
中创建
article\u view.xml
。我刚刚试用了你的更新代码,效果非常好。你在大屏幕手机上试用过吗@ArcticWhite根视图的类型应该是ViewGroup还是View?前者无法编译并使用后者,我仍然得到相同的NPE。我还尝试将文章_view.xml复制到@heisenberg建议的大版面。如果您想亲自尝试,我已经将代码推到了一个新分支:没错,rootView是一个视图。我编辑了答案。我用一个我认为适用于大型布局设备的修复程序编辑了答案。检查是否有帮助谢谢!新文章_view.xml现在很好用。很高兴听到它;)对不起,这个结构对我仍然不起作用。我试过几种模拟平板设备,包括Nexus 7和Nexus 7 2012,它们都应该使用“大型”布局。测试时您正在模拟什么设备?设备使用的API版本是什么?@AlexSpurling我使用的是Acer ICONIA ONE 8 B1-810,
API
4.4.4