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)