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