
第一個錯誤: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的各個參數了。