2011-03-11 10 views
3

リスト状態のDrawableでAndroid 1.6でmutateを使用しているときは、常にNull Pointer Exceptionを取得しました。それは、より高いAndroidバージョンで完璧に動作します。私は、デフォルトのアンドロイドlist_selector_backgroundをドロウアブルとして使用しています。突然変異させる必要があります。そうでなければ、背景が押しつぶされてしまいます。DrawableのmutateメソッドのNullPointerException Android 1.6

プロジェクトはここにある:以下http://code.google.com/p/tree-view-list-android/source/browse/src/pl/polidea/treeview/AbstractTreeViewAdapter.java#205

return activity.getResources() 
        .getDrawable(android.R.drawable.list_selector_background) 
        .mutate(); 

スタックトレース:

http://code.google.com/p/tree-view-list-android/

そしてここでのコードの関連部分

3-11 11:37:39.973: ERROR/AndroidRuntime(5304): java.lang.NullPointerException 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.graphics.drawable.StateListDrawable.mutate(StateListDrawable.java:227) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at pl.polidea.treeview.AbstractTreeViewAdapter.getDrawableOrDefaultBackground(AbstractTreeViewAdapter.java:201) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at pl.polidea.treeview.AbstractTreeViewAdapter.populateTreeItem(AbstractTreeViewAdapter.java:210) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at pl.polidea.treeview.AbstractTreeViewAdapter.getView(AbstractTreeViewAdapter.java:153) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.AbsListView.obtainView(AbsListView.java:1273) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.ListView.makeAndAddView(ListView.java:1658) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.ListView.fillDown(ListView.java:637) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.ListView.fillFromTop(ListView.java:694) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.ListView.layoutChildren(ListView.java:1516) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.AbsListView.onLayout(AbsListView.java:1112) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.view.View.layout(View.java:6569) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.view.View.layout(View.java:6569) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.view.View.layout(View.java:6569) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.view.View.layout(View.java:6569) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.view.View.layout(View.java:6569) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.view.ViewRoot.performTraversals(ViewRoot.java:979) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1613) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.os.Looper.loop(Looper.java:123) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at android.app.ActivityThread.main(ActivityThread.java:4203) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
03-11 11:37:39.973: ERROR/AndroidRuntime(5304):  at dalvik.system.NativeStart.main(Native Method) 

答えて

9

そこにあると思われますAndroid 1.6のバグあなたは、Android 1.6のソースに飛び込むときは、次のコードを見つけることができます:

ラインで
android.graphics.drawable.StateListDrawable.java: 
... 
public Drawable mutate() { 
    if (!mMutated && super.mutate() == this) { 
     final int[][] sets = mStateListState.mStateSets; 
     final int count = sets.length; 
     mStateListState.mStateSets = new int[count][]; 
     for (int i = 0; i < count; i++) { 
      mStateListState.mStateSets[i] = sets[i].clone(); //NPE causing line 
     } 
     mMutated = true; 
    } 
    return this; 
} 
... 

mStateListState.mStateSets[i] = sets[i].clone(); //NPE causing line 

クローン()メソッドを時々ヌルオブジェクト上と呼ばれ、それが

NullPointerExceptionが発生していますAndroidの

> 1.6 修正済み:

public Drawable mutate() { 
     if (!mMutated && super.mutate() == this) { 
      final int[][] sets = mStateListState.mStateSets; 
      final int count = sets.length; 
      mStateListState.mStateSets = new int[count][]; 
      for (int i = 0; i < count; i++) { 
       final int[] set = sets[i]; 
       if (set != null) { 
        mStateListState.mStateSets[i] = set.clone(); 
       } 
      } 
      mMutated = true; 
     } 
     return this; 
    } 

でも、Android 1.6では回避策を講じる必要があります。なぜmStateSets [i]がnullを含むのかを見てみましょう。上記のメソッドはxmlからオブジェクトを膨張させているときに呼び出されます。したがって、mStateListState.mStateSetsのサイズはN * 10です。

さて、あなたはandroid.R.drawable.list_selector_backgroundによって参照のうえ資源から膨張するようにしようとしているlist_selector_background.xmlの体を見てみましょう:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Copyright (C) 2008 The Android Open Source Project 

    Licensed under the Apache License, Version 2.0 (the "License"); 
    you may not use this file except in compliance with the License. 
    You may obtain a copy of the License at 

      http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License. 
--> 

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_window_focused="false" 
     android:drawable="@color/transparent" /> 

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> 
    <item android:state_focused="true" android:state_enabled="false" 
     android:state_pressed="true" 
     android:drawable="@drawable/list_selector_background_disabled" /> 
    <item android:state_focused="true" android:state_enabled="false" 
     android:drawable="@drawable/list_selector_background_disabled" /> 

    <item android:state_focused="true" android:state_pressed="true" 
     android:drawable="@drawable/list_selector_background_transition" /> 
    <item android:state_focused="false" android:state_pressed="true" 
     android:drawable="@drawable/list_selector_background_transition" /> 

    <item android:state_focused="true" 
     android:drawable="@drawable/list_selector_background_focus" /> 

</selector> 

このファイルには、6項目が含まれています! どうすれば問題を解決できますか? 1. drowable /あなたがAndroidのものをコピーして、一行のみ変更することができます/ {プロジェクト}/resをでlist_selector_background.xmlを作成します。

<item android:state_window_focused="false" android:drawable="@android:color/transparent" /> 
  1. コピーAndroidや独自に作成し

    <item android:state_window_focused="false" 
        android:drawable="@color/transparent" /> 
    

    をファイル:

    list_selector_background_disabled.9.png list_selector_background_focus.9.png list_selector_background_longpres s.9.png list_selector_background_pressed.9.png list_selector_background_transition.xml

  2. 修正list_selector_background。

    <item android:animationCache="true" 
        android:drawable="@android:color/transparent" /> 
    
    <item android:animationCache="false" 
        android:drawable="@android:color/transparent" /> 
    
    <item android:alwaysDrawnWithCache="false" 
        android:drawable="@android:color/transparent" /> 
    
    <item android:alwaysDrawnWithCache="true" 
        android:drawable="@android:color/transparent" /> 
    

ほら:正確(6 + 4 = 10)項目condidtionに合わせてダミー項目を追加するXML。コンパイルして実行します。今はうまくいくはずです。

+0

チャームのように動作します:)。 –

+0

は、一部のEclairデバイス(LG GT540)でも発生します。あなたの修正は役立ちます。 – Thorstenvv

関連する問題