先看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下面是中文翻译