Fragment是构成灵活UI的重要部分。最近学习到Fragment的使用时候,碰到一个问题。主程序程序布局非常简单:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SlidingPaneLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/slidingPanelLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"> <fragment
android:id="@+id/bookmarkFragment"
android:name="com.hnb.zzk.slidingpanellayouttest.BookMarkerFragment"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="left"/> <fragment
android:id="@+id/browserFragment"
android:name="com.hnb.zzk.slidingpanellayouttest.BrowserFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="right"
android:layout_weight="1"/> </android.support.v4.widget.SlidingPaneLayout>

  就是两个Fragment构成主要布局,然后在Java代码中获取Fragment:

SlidingPaneLayout spl = (SlidingPaneLayout) this.findViewById(R.id.slidingPanelLayout);
spl.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() {
@Override
public void onPanelSlide(View panel, float slideOffset) { } @Override
public void onPanelOpened(View panel) {
MainActivity.this.getFragmentManager().findFragmentById(R.id.bookmarkFragment).setHasOptionsMenu(true);
} @Override
public void onPanelClosed(View panel) {
MainActivity.this.getFragmentManager().findFragmentById(R.id.bookmarkFragment).setHasOptionsMenu(false);
}
});

  初步看起来似乎一切顺利,代码也是精简的一塌糊涂。于是乎运行起来看看,在模拟器中却直接奔溃,赶紧加上异常捕捉代码,得到如下结果:

java.lang.NullPointerException
at com.hnb.zzk.slidingpanellayouttest.MainActivity$2.onPanelOpened(MainActivity.java:44)
at android.support.v4.widget.SlidingPaneLayout.dispatchOnPanelOpened(SlidingPaneLayout.java:343)
at android.support.v4.widget.SlidingPaneLayout$DragHelperCallback.onViewDragStateChanged(SlidingPaneLayout.java:1318)
at android.support.v4.widget.ViewDragHelper.setDragState(ViewDragHelper.java:874)
at android.support.v4.widget.ViewDragHelper.forceSettleCapturedViewAt(ViewDragHelper.java:592)
at android.support.v4.widget.ViewDragHelper.settleCapturedViewAt(ViewDragHelper.java:569)
at android.support.v4.widget.SlidingPaneLayout$DragHelperCallback.onViewReleased(SlidingPaneLayout.java:1354)
at android.support.v4.widget.ViewDragHelper.dispatchViewReleased(ViewDragHelper.java:767)
at android.support.v4.widget.ViewDragHelper.releaseViewForPointerUp(ViewDragHelper.java:1395)
at android.support.v4.widget.ViewDragHelper.processTouchEvent(ViewDragHelper.java:1213)
at android.support.v4.widget.SlidingPaneLayout.onTouchEvent(SlidingPaneLayout.java:826)

  在onPanelOpend()方法里面出现了空指针异常。可能出现空指针异常的就是getFragmentManager()和findFragmentById()两个调用。findFragmentById()应该不太可能出现空指针异常,布局文件中两个fragment明摆着。那么只能说是getFragmentManager()这个调用出现了指针。在Fragment的开发文档中明确指出,Fragment的管理都是通过FragmentManager来实现的,那么问题出现在哪呢?在网上搜了一番终于发现了症结所在。我们引用的是v4兼容包中的Fragment组件,而getFragmentManager()是针对v11+的Fragment的,因此将getFragmentManager()替换成getSupportFragmentManager()就好了。

Android中的FragmentManager的问题的更多相关文章

  1. Android中Fragment和ViewPager那点事儿(仿微信APP)

    在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...

  2. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  3. Android中的接口回调技术

    Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...

  4. Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解

    在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...

  5. Android中使用开源框架PagerSlidingTabStrip实现导航标题

    此开源框架官网地址:https://github.com/astuetz/PagerSlidingTabStrip 可以理解为配合ViewPager使用的交互式页面指示器控件. 话不多说,先上效果图: ...

  6. android中Fragment的使用

    android中的Fragment跟网页中的iframe很像,用于在界面上嵌入局部动态内容,我的描述可能不准确,只是我的理解吧 创建Fragment很简单,在Android Studio中是这么创建的 ...

  7. Android中ViewPager实现滑动条及与Fragment结合的实例教程

    ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...

  8. 理解android中ListFragment和Loader

    一直以来不知Android中Loader怎么用,今天晚上特意花了时间来研究,算是基本上搞明白了,现在把相关的注释和代码发出来,以便笔记和给网友一个参考,错误之处还望大家给我留言,共同进步,这个例子采用 ...

  9. Android 中Dialog的使用

    本文是参考ProAndroid的第10章Working with Dialogs的内容,在合适的地方添加了作者自己的一些见解最终成文. Android 中的对话框是一个展示在当前窗口上的小一号的窗口, ...

随机推荐

  1. Web Essentials之Bundling

    返回Web Essentials功能目录 本篇目录 介绍 样例文件 已知行为 介绍 这篇要讲的是Bundling,我看很多人把它翻译为捆绑,如果你喜欢你也可以这么理解,我是不太习惯,我还是喜欢它为bu ...

  2. 使用C#设计Fluent Interface

    我们经常使用的一些框架例如:EF,Automaper,NHibernate等都提供了非常优秀的Fluent Interface, 这样的API充分利用了VS的智能提示,而且写出来的代码非常整洁.我们如 ...

  3. 必应词典UWP版-开发小结

    摘要 必应词典UWP版已经上线2周了!相信有不少用户都已经体验过了吧!得益于Win10全新.强大的API,新版词典在性能上.UI体验上都有了大幅的提升,今天,小编就为大家讲讲必应词典UWP开发的故事. ...

  4. 【情人节来一发】网站添加QQ客服功能

    今年的元宵节遇到情人节,挺不自量力的,呵呵,开篇给各位讲个段子,早上一美女同学在空间发说说道:“开工大吉 起床啦,卖元宵,卖玫瑰,卖避孕套啦-有木有一起去发财的小伙伴?Let’s go…”,对于此种长 ...

  5. js中各种跨域问题实战小结(一)

    什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...

  6. 【重要更新】Senparc.Weixin SDK v4.4 升级说明

    本次更新同时影响以下所有Senparc.Weixin相关版本的dll: Senparc.Weixin.dll 升级到 v4.4.2(重要) Senparc.Weixin.MP.dll 升级到 v13. ...

  7. 翻译:AKKA笔记 - 介绍Actors

    任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的. 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋.但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 ...

  8. [Spring框架]Spring 事务管理基础入门总结.

    前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一 ...

  9. Atitit.架构设计趋势 设计模式 ---微服务架构  soa

    Atitit.架构设计趋势 设计模式 ---微服务架构  soa 什么是微服务架构?1 .微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现1 微服务与康威定律2 微服务的一些 ...

  10. 敏捷数据科学:用Hadoop创建数据分析应用

    敏捷数据科学:用Hadoop创建数据分析应用(数据分析最佳实践入门敏捷大数据首作分步骤|全流程演示思路.工具与方法) [美]Russell Jurney(拉塞尔·朱尔尼) 著   冯文中 朱洪波 译 ...