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上でのみ起こっています。それ以外のバージョンはすべて正しく処理します。

今のところ、if(!getResources().getBoolean(R.bool.tablet))if(!getResources().getBoolean(R.bool.tablet) && Build.VERSION.SDK_INT < Build.VERSION_CODES.O)に変更して、Android Oでツールバーを読み込まないようにしました。これは今でもタブレットデバイス(8.0を実行しているタブレットでも問題なく動作します)ツールバーの削除を含まない修正はうまくいくでしょう。

+0

が設定した他のレイアウトと同じR.layout.preference_no_buttonsですタブレットを使用している場合は?一部のビュー要素が欠落している可能性があります –

+0

使用中のXMLファイルのコードを追加しました。また、私はそれについて言及しなかったが、このコードはタブレットデバイスでうまく機能する。タブレット端末では、私は追加のリソースをロードしません。 – Randy

+0

エラーログ全体を投稿することはできますか?また、他のレイアウトソースも必要です –

答えて

0

グーグルによると、これは、それは、Androidの以前のバージョンで正常に働いていたにも関わらず、意図した動作です: https://issuetracker.google.com/issues/36873126

いくつかのより多くの読み取りを行った後、私はPreferenceActivityが使用するデバイスのために使用すべきではないことがわかりましたAndroid 3.0以降のバージョン。

私は下のデバイスをサポートしておりませんのでとAndroid 4.0私は以降に変更された私のPreferenceActivity、ここで説明したようPreferenceFragmentを使用しています平野Activityへ: https://developer.android.com/guide/topics/ui/settings.html

関連する問題