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