關於FragmentManager findFragmentById 返回nul


先看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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM