過時的PreferenceActivity導致Fragment顯示問題

問題描述:

    在一個點擊preferenceactivity中某項顯示一個Fragment的場景中,出現錯誤:

java.lang.RuntimeException: This should be called after super.onCreate.

百思不得其解。因爲報錯的那一行是在super.onCreate之後的,代碼很簡單應該也不會有錯誤。因爲當時項目代碼很大,且簽名成系統應用,所以不好調試。最後自己寫了個簡單的demo來測試,發現在啓動fragment中顯示找不到需要啓動的fragment。找不到之後會再次回到preferenceactivity這個界面,就會導致錯誤。啓動Fragment的代碼如下:

preferenceactivity.startPreferencePanel(PowerUsageDetail.class.getName(), args, R.string.details_title, null, null, 0);

或者

startWithFragment(DemoFragment.class.getName(), null, null, 0);


問題原因:

    除了如上所示原因之外。android在level 11之後似乎就對preferenceactivity不支持了,推薦使用PreferenceFragment 

但是本項目大部分代碼都是寫好了,不好修改。所以還是要考慮保持原樣啓動要求的Fragment。所以原因是android對其不支持了。


解決方法:

    在響應點擊的地方使用如下代碼,顯示相關的Fragment:

        FragmentManager fm = caller.getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        PowerUsageDetail pd = new PowerUsageDetail();

        Intent i = new Intent();
        i.putExtras(args);
        pd.setArguments(args);
        ft.add(android.R.id.content, pd);
        ft.addToBackStack("wodebackstack");
        ft.commit();

注意對於的ViewGroupId爲android.R.id.content。在PreferenceActivity中一般是用loadFromResources來載入佈局,沒辦法定義id。android.R.id.content表示的是視圖的根id。

注意:

這樣啓動Fragment之後會顯示透明背景,也就是說父PreferenceActivity會顯示出來,顯然不行。設置目的Fragment的背景即可,在layout佈局中設置背景爲android:background="@android:color/background_light"


總結:

1. 出現問題沒有第一時間寫一個簡單的demo確認問題所在。

2. 對於過期的api認識不足,以爲可以通過源碼找到繞過問題所在。在查看源碼上面花了很多時間。

3. 不知道如何獲取PreferenceActivity的根view的id,導致拉長了解決問題時間。

4. 經常陷入細節中,應該從更高的層次理解代碼。抽象、分層、模塊化、規整化。





發佈了80 篇原創文章 · 獲贊 119 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章