那些年,在Fragment中犯的錯

來源:互聯網
上載者:User

         ,這題目起的夠騷情了,原創傲慢的上校哦,轉載請標明:http://blog.csdn.net/aomandeshangxiao/article/details/7753421

其實有些方法也是從網上找來的,拿來主義,共同分享下(Fragment其他資料:android之Fragment(官網資料翻譯))。


第一個錯誤:FragmentManagerImpl.saveFragmentBasicState

下面是log:

        

E/AndroidRuntime(29923): FATAL EXCEPTION: mainE/AndroidRuntime(29923): java.lang.NullPointerExceptionE/AndroidRuntime(29923):     at android.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1544)E/AndroidRuntime(29923):     at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1574)E/AndroidRuntime(29923):     at android.app.Activity.onSaveInstanceState(Activity.java:1213)E/AndroidRuntime(29923):     at android.app.Activity.performSaveInstanceState(Activity.java:1162)E/AndroidRuntime(29923):     at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1287)E/AndroidRuntime(29923):     at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3208)E/AndroidRuntime(29923):     at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3266)E/AndroidRuntime(29923):     at android.app.ActivityThread.access$900(ActivityThread.java:139)E/AndroidRuntime(29923):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1279)E/AndroidRuntime(29923):     at android.os.Handler.dispatchMessage(Handler.java:99)E/AndroidRuntime(29923):     at android.os.Looper.loop(Looper.java:156)E/AndroidRuntime(29923):     at android.app.ActivityThread.main(ActivityThread.java:5005)E/AndroidRuntime(29923):     at java.lang.reflect.Method.invokeNative(Native Method)E/AndroidRuntime(29923):     at java.lang.reflect.Method.invoke(Method.java:511)E/AndroidRuntime(29923):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)E/AndroidRuntime(29923):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)E/AndroidRuntime(29923):     at dalvik.system.NativeStart.main(Native Method)

看老半天log,沒有琢磨明白,在網上找了下,說出現這個問題,主要是以下兩個因素:

       一是用了android.support.v4包,

       二是FragmentActivity.

       本人正是在從Fragment跳轉到另一個Activity時候報的錯,據說是個官方Bug,已經有程式員把這個問題提交到官方了,https://android-review.googlesource.com/#/c/31261/。

下面看看他們提交的內容:

        

If a fragment's saved view state is null and the user visible hint is true then the `result` bundle will havenever been initialized to a value resulting in a `NullPointerException`.


        如果一個Fragment儲存的檢視狀態為Null並且使用者可見提示為true,那麼'result' bundle(要儲存的Bundle)會有一個微博初始化的值,然後導致null 指標異常。

        如何解決此問題呢?問題出在Save上,在有Fragment的Activity中重寫onSaveInstanceState()方法,並且注釋掉super.onSaveInstanceState(),這樣就不會調用父類的onSaveInstanceState(outState)方法了,就不會報異常了。

outState 對象為空白..在onSaveInstanceState()函數中不使用到outState即可.[java] view plaincopy@Override      protected void onSaveInstanceState(Bundle outState) {          // TODO Auto-generated method stub           //super.onSaveInstanceState(outState);                }  

第二個、使用ListFragment:java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class

            在ListFragment中,想當然的以為,像其他Fragment一樣:

public class ListFragmentTest extends ListFragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View root = inflater.inflate(R.layout.list, null);return root;}

在list.xml裡面:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >        <TextView         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/app_name"        />    <ListView         android:id="@+id/list"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        ></ListView></LinearLayout>

看下log:

07-16 15:43:22.026: E/AndroidRuntime(605): FATAL EXCEPTION: main07-16 15:43:22.026: E/AndroidRuntime(605): java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.demo/cn.demo.FragmentTestActivity}: android.view.InflateException: Binary XML file line #23: Error inflating class fragment07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ActivityThread.access$600(ActivityThread.java:123)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)07-16 15:43:22.026: E/AndroidRuntime(605): at android.os.Handler.dispatchMessage(Handler.java:99)07-16 15:43:22.026: E/AndroidRuntime(605): at android.os.Looper.loop(Looper.java:137)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ActivityThread.main(ActivityThread.java:4424)07-16 15:43:22.026: E/AndroidRuntime(605): at java.lang.reflect.Method.invokeNative(Native Method)07-16 15:43:22.026: E/AndroidRuntime(605): at java.lang.reflect.Method.invoke(Method.java:511)07-16 15:43:22.026: E/AndroidRuntime(605): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)07-16 15:43:22.026: E/AndroidRuntime(605): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)07-16 15:43:22.026: E/AndroidRuntime(605): at dalvik.system.NativeStart.main(Native Method)07-16 15:43:22.026: E/AndroidRuntime(605): Caused by: android.view.InflateException: Binary XML file line #23: Error inflating class fragment07-16 15:43:22.026: E/AndroidRuntime(605): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)07-16 15:43:22.026: E/AndroidRuntime(605): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)07-16 15:43:22.026: E/AndroidRuntime(605): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)07-16 15:43:22.026: E/AndroidRuntime(605): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)07-16 15:43:22.026: E/AndroidRuntime(605): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)07-16 15:43:22.026: E/AndroidRuntime(605): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.Activity.setContentView(Activity.java:1835)07-16 15:43:22.026: E/AndroidRuntime(605): at cn.demo.FragmentTestActivity.onCreate(FragmentTestActivity.java:11)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.Activity.performCreate(Activity.java:4465)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)07-16 15:43:22.026: E/AndroidRuntime(605): ... 11 more07-16 15:43:22.026: E/AndroidRuntime(605): Caused by: java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ListFragment.ensureList(ListFragment.java:402)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.ListFragment.onViewCreated(ListFragment.java:203)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:811)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1010)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1108)07-16 15:43:22.026: E/AndroidRuntime(605): at android.app.Activity.onCreateView(Activity.java:4243)07-16 15:43:22.026: E/AndroidRuntime(605): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)07-16 15:43:22.026: E/AndroidRuntime(605): ... 21 more

        為什麼呢?因為ListFragment裡面已經提供了系統內建的ListView,這樣寫,當然出錯。可以直接不重寫OnCreatView方法,使用getListView()擷取系統提供的ListView,但是擷取的ListView設定Item間隔線只能getListView().setDivider(divider),其參數為Drawable類型。當然如果只想簡單的設定下Divider的顏色呢?

        其實ListFragment當然運行自訂布局,但是Listview要用系統的:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >        <TextView         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/app_name"        />    <ListView         android:id="@id/android:list"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        ></ListView></LinearLayout>

在這裡,就可以方便的設定listview的各個參數了。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.