關於FragmentManager findFragmentById 返回nul,findfragmentbyid
先看Fragment的兩種產生方式
一.用xml標籤產生
在fragment的宿主activity中添加xml標籤
1 <fragment2 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