0

我的代碼非常簡單。setContentView在Android 8.0上導致PreferenceActivity崩潰

public class SettingsMenuNew extends PreferenceActivity 
{ 
    ... 

    @Override 
    public void onBuildHeaders(List<Header> target) 
    { 
     if(!getResources().getBoolean(R.bool.tablet)) { 
      setContentView(R.layout.preference_no_buttons); 
     } 

     loadHeadersFromResource(R.xml.settings_menu, target); 
    } 
    .... 
} 

preference_no_buttons.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"> 

    <include 
     layout="@layout/settings_toolbar" 
     android:id="@+id/toolbar" /> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
</LinearLayout> 

settings_toolbar.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    app:title="@string/Settings" 
    app:titleTextColor="@color/menuWhite"/> 

...是被覆蓋等方法,但只實現了super.<method>()(和isValidFragment這似乎工作正確)

基本上,如果該設備不是平板設備,則會加載PreferenceActivity的工具欄。

此代碼適用於除運行Android 8.0的設備以外的所有設備。在8.0我得到以下錯誤:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.setLayoutTransition(android.animation.LayoutTransition)' on a null object reference

完整的錯誤信息:

16507/<myApp> E/AndroidRuntime: FATAL EXCEPTION: main 
Process: <myApp>, PID: 16507 

java.lang.RuntimeException: Unable to start activity ComponentInfo{<myApp>/<myApp>.SettingsMenuNew}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.setLayoutTransition(android.animation.LayoutTransition)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
at android.app.ActivityThread.-wrap11(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6541) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.setLayoutTransition(android.animation.LayoutTransition)' on a null object reference 
at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:653) 
at <myApp>.SettingsMenuNew.onCreate(SettingsMenuNew.java:33) 
at android.app.Activity.performCreate(Activity.java:6975) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)  
at android.app.ActivityThread.-wrap11(Unknown Source:0)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)  
at android.os.Handler.dispatchMessage(Handler.java:105)  
at android.os.Looper.loop(Looper.java:164)  
at android.app.ActivityThread.main(ActivityThread.java:6541)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

onCreate()方法運行後,但取出setContentView(R.layout.preference_no_buttons);修復崩潰的線會出現此錯誤。我試着將這些代碼移到其他方法(onCreate和​​),但我仍然得到相同的錯誤。有誰知道如何解決這個錯誤?再次,它只發生在Android 8.0上。所有其他版本正確處理它。它也可以在平板設備上正常運行(即使是運行8.0的平板電腦,因爲在該場景中從未運行有問題的代碼)。

現在我已將if(!getResources().getBoolean(R.bool.tablet))更改爲if(!getResources().getBoolean(R.bool.tablet) && Build.VERSION.SDK_INT < Build.VERSION_CODES.O)以避免在Android O上加載工具欄,但一個不涉及刪除工具欄的修復程序會很好。

+0

是R.layout.preference_no_buttons一樣的,你設置的其他佈局如果你使用平板電腦?您可能會缺少一些視圖元素 –

+0

我剛添加了正在使用的XML文件的代碼。另外,我沒有提到它,但是這個代碼在平板設備上工作正常。在平板電腦設備上,我不會加載任何其他資源。 – Randy

+0

你也可以發佈完整的錯誤日誌嗎?另外,我也需要其他佈局源代碼。 –

回答

0

據谷歌稱,這是預期的行爲,即使它在舊版Android設備工作正常: https://issuetracker.google.com/issues/36873126

做一些更多的閱讀後,我發現PreferenceActivity不應該被用於使用設備3.0以後的Android版本。

因爲我不支持的設備比和Android 4.0因爲我已經改變了我的PreferenceActivity成採用PreferenceFragment這裏描述一個普通的Activityhttps://developer.android.com/guide/topics/ui/settings.html