10

最新バージョンの互換性lib(つまり、4.3 Androidバージョンでリリースされたv18 of compat-lib)を使用しているときにNullpointer例外に直面しています。アクションバーのリストナビゲーションメニューモード。このエラーはAndroid 2.3.3バージョンで発生します。このバージョン(と他のバージョン)では、使用されているアクションバーコード全体がcompat-libコードであるため、それは信じています。ここでアクションバーリストメニューでカスタムアダプタを使用しているときのヌルポインタ

07-30 18:17:59.296: E/AndroidRuntime(14701): FATAL EXCEPTION: main 
07-30 18:17:59.296: E/AndroidRuntime(14701): java.lang.NullPointerException 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.ListPopupWindow$DropDownListView.measureHeightOfChildrenCompat(ListPopupWindow.java:1317) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1062) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.ListPopupWindow.show(ListPopupWindow.java:514) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.SpinnerICS$DropdownPopup.show(SpinnerICS.java:758) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.SpinnerICS.performClick(SpinnerICS.java:443) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.view.View$PerformClick.run(View.java:9109) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.os.Handler.handleCallback(Handler.java:587) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.os.Looper.loop(Looper.java:130) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at android.app.ActivityThread.main(ActivityThread.java:3683) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at java.lang.reflect.Method.invokeNative(Native Method) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at java.lang.reflect.Method.invoke(Method.java:507) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653) 
07-30 18:17:59.296: E/AndroidRuntime(14701): at dalvik.system.NativeStart.main(Native Method) 

は(item_menu_dropdown_celula.xmlと呼ばれる)ドロップダウン細胞のxmlです::私は(アクションバーでの)リストメニューに私のアプリのクラッシュをクリックして、私はlogcatで次のエラーが表示さ

public class SpinnerListMenu implements SpinnerAdapter{ 

    private List<ItemMenu> itens; 
    private LayoutInflater inflater; 

    public SpinnerListMenu(Context context, List<ItemMenu> listaItens) { 
     this.itens = listaItens; 
     this.inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return itens.size(); 
    } 

    @Override 
    public ItemMenu getItem(int arg0) { 
     return itens.get(arg0); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     View row = convertView; 

     if ((row == null) || (row.getTag() == null)) { 

      row = inflater.inflate(R.layout.item_menu_celula, null); 
      holder = new ViewHolder(row); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 

     ItemMenu atual = getItem(position); 

     holder.texto.setText(atual.getNomeDaArea()); 

     holder.icone.setBackgroundResource(atual.getIconeMenuFechadoResource()); 
     holder.icone.setScaleType(ScaleType.FIT_CENTER); 

     return row; 
    } 

    private class ViewHolder { 
     ImageView icone; 
     TextView texto; 

     public ViewHolder(View base) { 
      icone = (ImageView) base.findViewById(R.id.icone); 
      texto = (TextView) base.findViewById(R.id.texto); 
     } 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 0; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isEmpty() { 
     return itens.size() == 0; 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 

    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 

    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     final ViewHolderDD holder; 
     View row = convertView; 

     if ((row == null) || (row.getTag() == null)) { 
      row = inflater.inflate(R.layout.item_menu_dropdown_celula, null); 
      holder = new ViewHolderDD(row); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolderDD) row.getTag(); 
     } 

     ItemMenu atual = getItem(position); 

     holder.texto.setText(atual.getNomeDaArea()); 
     holder.icone.setBackgroundResource(atual.getIconeMenuAbertoResource()); 

     return row; 
    } 

    private class ViewHolderDD { 
     ImageView icone; 
     TextView texto; 

     public ViewHolderDD(View base) { 
      icone = (ImageView) base.findViewById(R.id.icone); 
      texto = (TextView) base.findViewById(R.id.texto); 
     } 
    } 
} 

で:

<?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:background="@drawable/spinner_subitem_background_ab_boadicatema" 
    android:gravity="center" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/icone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:scaleType="fitCenter" /> 

    <TextView 
     android:id="@+id/texto" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dip" 
     android:gravity="left|center_vertical" 
     android:shadowColor="@android:color/black" 
     android:shadowDx="0" 
     android:shadowDy="1" 
     android:shadowRadius="0.1" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/white" 
     android:textStyle="bold" /> 

</LinearLayout> 

そしてここでは、スピナーアダプターのコードです私はメニューと彼のアダプターをコードで設定しました:

//This class correctly extends ActionBarActivity 
//here we area inside onCreate method 
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
ArrayList<ItemMenu> itens = = new ArrayList<ItemMenu>(); 

//Here I add 2 itens in the arraylist 
//... 
getSupportActionBar().setListNavigationCallbacks(
       new SpinnerListMenu(this, itens), this); 

さらに詳しい情報があります。私の活動で、アレイアダプタを使用しているときなど、...

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, 
      android.R.layout.simple_spinner_dropdown_item); 

これは動作しますが、バグは発生しません。

このバグの原因について誰かが手掛かりを持っていますか? (これは互換性のlib自体のバグでも(私の推測では、スタックトレースを見て、自分のxmlの多くのプロパティを変更した後))

答えて

27

この問題をAndroidの問題追跡ツールI Androidプロジェクトメンバーの方がはるかに良いanswer(私の古いものより)を受け取った。 これを修正するための正しい方法は、ソリューションを投稿するためのライン線で

row = inflater.inflate(R.layout.item_menu_dropdown_celula, null); 

row = inflater.inflate(R.layout.item_menu_dropdown_celula, parent, false); 
+0

感謝を交換することです! – nsL

+1

+1 ...本当に良い。私の時間を節約しました。 – AndroidHacker

関連する問題