1. 程式人生 > >android之Fragment的bug解決

android之Fragment的bug解決

最近做一個功能,當第二次進入一個介面的時候出現一個奇怪的bug,如下面詳細的log資訊:

10-01 13:36:23.549: E/AndroidRuntime(14188): Process: com.android.settings, PID: 14188
10-01 13:36:23.549: E/AndroidRuntime(14188): android.view.InflateException: Binary XML file line #43: Error inflating class fragment
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at com.android.settings.accessibility.ToggleCaptioningPreferenceFragment.onCreateView(ToggleCaptioningPreferenceFragment.java:69)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.Fragment.performCreateView(Fragment.java:1700)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.BackStackRecord.run(BackStackRecord.java:698)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.os.Handler.handleCallback(Handler.java:808)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.os.Handler.dispatchMessage(Handler.java:103)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.os.Looper.loop(Looper.java:193)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.ActivityThread.main(ActivityThread.java:5333)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at java.lang.reflect.Method.invokeNative(Native Method)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at java.lang.reflect.Method.invoke(Method.java:515)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at dalvik.system.NativeStart.main(Native Method)
10-01 13:36:23.549: E/AndroidRuntime(14188): Caused by: java.lang.IllegalArgumentException: Binary XML file line #43: Duplicate id 0x7f0b0034, tag null, or parent id 0xffffffff with another fragment for com.android.settings.accessibility.CaptionPropertiesFragment
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.app.Activity.onCreateView(Activity.java:4912)
10-01 13:36:23.549: E/AndroidRuntime(14188): 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
如上的log資訊可以知道:載入了一個(Duplicate)重複的Fragment(CaptionPropertiesFragment)。問題是程式碼應該是沒有問題的!具體看看我係的程式碼:
public class ToggleCaptioningPreferenceFragment extends Fragment {
    private static final float DEFAULT_FONT_SIZE = 48f;

    private CaptionPropertiesFragment mPropsFragment;
    private SubtitleView mPreviewText;
    private CaptioningManager mCaptioningManager;


	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mCaptioningManager = (CaptioningManager) getActivity()
                .getSystemService(Context.CAPTIONING_SERVICE);
    }

    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
	

        final View rootView = inflater.inflate(R.layout.captioning_preview, container, false);

        // We have to do this now because PreferenceFrameLayout looks at it
        // only when the view is added.
        if (container instanceof PreferenceFrameLayout) {
            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
        }


        return rootView;
    }

從報錯資訊可以知道出錯的程式碼:final View rootView = inflater.inflate(R.layout.captioning_preview, container, false);

那麼報錯資訊說是載入了重複的Fragment(CaptionPropertiesFragment)。實際上這個重複的Fragment在這個layout檔案裡面佈局的:R.layout.captioning_preview。

很顯然,就是第一次進入這個介面,再退出的時候,這個用過的Fragment(CaptionPropertiesFragment)沒有remove掉!從而出現了兩個問題:

(1)為什麼會出現這個Fragment(CaptionPropertiesFragment)沒有remove,

(2)怎麼解決這個問題!

        在activity中不同的frament之間專案替換的時候,FragmentManager只會remove和add這些frament,然而這些frament裡面自己載入的frament(這裡就是我們的CaptionPropertiesFragment)是沒有被remove. 很顯然這是一個缺陷!因為後一個frament(CaptionPropertiesFragment)很明顯是依賴與他的父frament的,應該同時遞迴的remove.

        那麼如何解決這個問題呢!很顯然就是在不用這個frament(ToggleCaptioningPreferenceFragment)的時候把他裡面載入的frament給remove掉!這個操作在ToggleCaptioningPreferenceFragment的onDestroyView()裡面就可以解決問題了!如下程式碼:

	@Override
	public void onDestroyView() {
		super.onDestroyView();

	 	if(mPropsFragment != null){
			FragmentManager f = getFragmentManager();
			if(f != null && !f.isDestroyed()){
				final FragmentTransaction ft = f.beginTransaction();
				if(ft != null){
					ft.remove(mPropsFragment).commit();
				}
			}
	 	}
	}
      這裡要注意f.isDestroyed()這樣來判斷是否這個FragmentManager處於Destroyed,如果不加這個判斷的話,橫豎屏切換時候會出錯!

     注意:對於這個問題,網上有各種無效的解決辦法。

相關推薦

Android如何解決部分手機拍照拍出來的照片是黑色

如何解決部分手機拍照拍出來的照片是黑色          最近專案做的是遠端拍照和遠端截圖的問題,遠端截圖用的是Android 5.0之後的API,MediaPrejectionManger,          拍照用的是呼叫系統的camera,用的surfaceView進

Androidjni解決JNIEnv跨執行緒問題

1、問題 JNIEnv是一個執行緒相關的變數 JNIEnv 對於每個 thread 而言是唯一的  JNIEnv *env指標不可以為多個執行緒共用 2、解決辦法 java虛擬機器的Jav

AndroidError: 'L' is not a valid file-based resource name character解決辦法

copyto base logo lower too exec article 問題 tools 1、問題 [html] view plain copy Error:Execution failed for task ‘:mergeBYODReleaseR

Android——使用Android studio建立的AIDL編譯時找不到自定義類的解決辦法

使用AS建立ADIL檔案時AS會在main資料夾下給我們生成一個aidl資料夾和一個相同包名的包,通常我們會把所有和ADIL相關的類或檔案放在這個包下,但是如果存在自定義的類時,程式編譯時無法通過,提示找不到自定義的包。解決辦法如下,在啟動Module的build.gra

AndroidAndroid WebView常見問題及解決方案彙總

就目前而言,如何應對版本的頻繁更新呢,又如何靈活多變地展示我們的介面呢,這又涉及到了web app與native app之間孰優孰劣的爭論. 於是乎,一種混合型的app誕生了,靈活多變的部分,如淘寶商城首頁的活動頁面,一集凡客誠品中我們都可以見到web 頁面與native頁面

Android打造自己載入高清大圖及瀑布流框架.解決錯位等問題.

    首先看效果圖如下:     本框架支援本地圖片和網路圖片的獲取.採用LruCache演算法,最少使用的最先釋放.有效的避免OOM,專案結構圖:          核心載入類在於ImageLoader.採用了TreadPool去做併發請求.UI處理採用Handler

深坑Webview,解決H5呼叫android相機拍照和錄影

最近在開發過程中遇到一個問題,主要是呼叫第三方的實名認證,需要拍照和錄影; 辦過支付寶大寶卡和騰訊的大王卡的都知道這玩意,辦卡的時候就需要進行實名認證,人臉識別; 本來第三方平臺(xxx流量公司)說的是直接用WebView載入這個H5介面就完事了,我心想這麼簡單

Android解決太大太多圖片造成的oom

在最近做的工程中發現載入的圖片太多或圖片過大時經常出現OOM問題,找網上資料也提供了很多方法,但自己感覺有點亂,特此,今天在不同型號的三款安卓手機上做了測試,因為有效果也有結果,今天小馬就做個詳細的總結,以供朋友們共同交流學習,也供自己以後在解決OOM問題上有所提高,提前講下,片幅有點長,涉及的東西太多,大家

AndroidMIUI系統BUG:呼叫拍照後不返回當前activity解決辦法

public void photo() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { //判斷資料夾是否存在,我的資料夾路徑是SDP

AndroidAndroid studio如何解決Multiple dex files define Landroid/support/a(檔案重複引用錯誤)

先爆錯誤的圖片照,如下  define 可以理解檔案重複的意思,所以這個錯誤是我匯入了v4.jar包的原因,因為我專案裡面本來就有v7.jar,如下圖 解決辦法一:               

Androidxxx is not a concrete class解決辦法

今天給以前一個app加歡迎介面,照著網上的教程做,改manifest.xml檔案的時候給我報一個com.aaa.Welcome is not a concrete class的錯誤,百思不得其解 我

androidFragment的bug解決

最近做一個功能,當第二次進入一個介面的時候出現一個奇怪的bug,如下面詳細的log資訊: 10-01 13:36:23.549: E/AndroidRuntime(14188): Process: com.android.settings, PID: 14188 10-01

Android解決Base64 encode中文亂碼問題

1、問題 需求需要,把字串轉化為UTF-8編碼之後需要base64.encode處理,但是我寫了 String ss = new String(value.getbytes("UTF-8"), "UTF-8"); Base64.encode(ss); 死活出不來,依然亂碼

Android Study 徹底解決 Gson解析 異常 :com.google.gson.JsonSyntaxException

LZ-Say:大風呼呼的刮,就好像妖精要來的前奏一樣~ 前言 開發過程中,App常用的接收引數的時候,幾乎大部分都是以json格式為主,那麼有關解析json的方式有很多,Android端相對來說使用Gson比較多,而在解析過程中,如果

AndroidListView包含RadioButton的單選問題解決辦法

1.最簡潔的解決辦法。 adapter裡儲存當前選中的位置變數,getView方法裡,禁用radiobutton的點選事件,只通過listview的onItemClick事件設定選中位置變數,並且通過notifyDataSetChanged重新整理列表。getView方法裡

我的Android進階旅------>解決錯誤:You need to use a Theme.AppCompat theme (or descendant) with this activity.

#1、錯誤描述 今天,想實現Activity不顯示標題欄的效果,在專案的AndroidManifest.xml檔案,對相應的Activity新增屬性 android:theme="@android:style/Theme.NoTitleBar" 具體程式

Android部分手機(oppo r9s)安裝app出現崩潰問題解決辦法

1、問題現象 部分手機(oppo r9s)安裝release版本的apk出現了崩潰,但是部分手機安裝正常 2、崩潰日誌 01-15 09:42:37.239 5889 5889 E AndroidRuntime: java.lang.OutOfMemoryError

我的Android進階旅------>解決Error:Could not find property 'compile' on org.gradle.api.internal.artifacts.

1錯誤描述 解決方法 1錯誤原因 2解決方法 1、錯誤描述 剛剛,Android Studio突然編譯不了了,報瞭如下錯誤: Error:Could not find proper

Android視訊播放器的使用及解決的問題

前言 根據專案要求 做一個淘寶今日頭條的功能 要求實現圖文和視訊的混排 在之前的部落格中我已經寫了頭條滾動demo———今日頭條的demo地址 就是這樣的一個效果 點選這個控制元件後 進入↓↓↓頭條的頁面 這篇部落格主要是記錄視訊的使用 關於文

android開發步步為營105:解決鍵盤彈起頁面被頂上去問題

           這個問題,我想大家經常碰到,網上回答的很多,但是沒有找到我想要的,網上提供的解決方案:1、比如Android:windowsoftinputmode="adjustpan"  2、使用scrollview 兩種都沒有解決我的問題,後來我就各種除錯啊,各