片段接口上的空指针

时间:2015-08-17 19:02:07

标签: android android-fragments

Google has an article on creating Activities using Fragments

您可以下载他们的示例项目here

在此示例中,使用小型设备(如手机)的人将看到HeadlinesFragment(列表),使用大型设备(如平板电脑)的人将看到HeadlinesFragment ArticleFragment(标题说明)。

我想改变这个项目,而不是大型设备的存在决定使用哪种布局,设备的方向将决定使用哪种布局。

理论上,这很简单。我只是将news_articles.xml文件从layout-large移动到新创建的layout-land并命中编译。

这实际上有效!但是,我遇到了一个错误,我不确定它是如何可能的。

如果您将设备旋转到横向,您将看到两个碎片。如果您将设备向后旋转到纵向,则只会看到HeadlinesFragment。但是,如果您点击HeadlinesFragement列表中的标题(一旦您从横向回到纵向),您现在将获得空指针异常。这是因为对R.id.article的引用是null,并且代码假定,如果你可以到达代码的那一部分,它将永远不会为null。

为什么会这样?好吧,这一切都归结为在MainActivity :: onArticleSelected()中做出的选择。由于articleFragment被评估为不为null,因此调用了articleFrag.updateArticleView。

这是我的问题:为什么articleFrag不为null? R.id.article_fragment不可用,因为设备以纵向方向返回,而纵向方向的news_article.xml文件不包含ArticleFragment。

我确定这与设备旋转有关。我真的很想知道这里发生了什么。感谢。

更新:我已使用MainActivity中的以下代码修复了崩溃。

@Override
public void onDestroy() {
    getSupportFragmentManager().getFragments().clear();

    super.onDestroy();
}

虽然我不确定为什么我需要这样做,以及它是如何解决我的问题的。

更新2:实际上我的Overriding onDestroy()实际上没有解决问题。这是一个logcat转储:

08-17 14:28:08.495  22957-22957/com.example.android.fragments E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.android.fragments, PID: 22957
    java.lang.NullPointerException
            at com.example.android.fragments.ArticleFragment.updateArticleView(ArticleFragment.java:63)
            at com.example.android.fragments.MainActivity.onArticleSelected(MainActivity.java:73)
            at com.example.android.fragments.HeadlinesFragment.onListItemClick(HeadlinesFragment.java:85)
            at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
            at android.widget.AdapterView.performItemClick(AdapterView.java:299)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
            at android.widget.AbsListView$3.run(AbsListView.java:3638)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

0 个答案:

没有答案