关于FragmentManager findFragmentById 返回nul

本文详细介绍了Android中Fragment的两种生成方式:XML标签生成与Java代码动态生成,并针对使用FragmentManager.findFragmentById返回null的问题提供了解决方案。

先看Fragment的两种生成方式

一.用xml标签生成

在fragment的宿主activity中添加xml标签

1     <fragment
2         android:id="@+id/fragment_newsContent"
3         android:name="com.firstcode.section4_news.NewsContentFragment"
4         android:layout_width="match_parent"
5         android:layout_height="match_parent"/>

name为你创建的fragment类

这种方法在activity创建时fragment已经生成了

在Activity中获取fragment实例的操作:

1         NewsContentFragment fragment = (NewsContentFragment) getFragmentManager().findFragmentById(R.id.fragment_newsContent);

 

二、用java代码动态生成

在fragment的宿主activity的视图文件中添加FrameLayout进行占位

1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
2     android:id="@+id/fragmentContainer"/>

在Activity中生成fragment的操作

1 FragmentManager fm = getFragmentManager();
2 fm.beginTransaction()
3    .add(R.id.fragmentContainer,“你创建的fragment类实例”)
.commit();

 

问题分析:

我在使用用FragmentManager.findFragmentById 返回nul的问题就在这,我是通过第二种方式来生成fragment的,也就是说在findFragmentById的实参

我填的是FrameLayout的Id,而非fragment的Id 所以会返回null

解决方案:

  1.如果是静态生成fragment,获取fragment实例用getFragmentManager().findFragmentById

  2.如果是java代码动态生成fragment,获取fragment实例直接new 一个就好了 没必要用getFragmentManager().findFragmentById

  3.注意xml文件中的标签FrameLayout与fragment

 

还有个问题,我也是这样解决的 在fragment视图里给textview添加文字

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

原因是通过java代码生成的fragment add里的Id参数填的是fragment的id 所以fragment的视图没有生成

 

理解两种fragment生成方式最好的文档莫过于google官方的Android Training下面是中文翻译

使用xml标签添加fragment

使用java代码动态添加fragment

转载于:https://www.cnblogs.com/morningsky/p/4750607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值