天天看點

android fragement報nullexcption錯誤

android fragement報nullexcption錯誤

第一個錯誤:fragmentmanagerimpl.savefragmentbasicstate

下面是log:

e/androidruntime(29923): fatal exception: main  

e/androidruntime(29923): java.lang.nullpointerexception  

e/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.

下面看看他們送出的内容:

        如何解決此問題呢?問題出在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 {  

    @override  

    public 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: main  

07-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 fragment  

07-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 fragment  

07-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 more  

07-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 class  

07-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要用系統的:

        android:id="@id/android:list"  

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

繼續閱讀