10

Ich bin mit einer Nullpointer-Ausnahme konfrontiert, wenn Sie die neueste Version der Kompatibilitäts-Lib (nämlich v18 of compat-lib, veröffentlicht mit der 4.3 Android-Version) und verwenden den Listennavigationsmenümodus in der Aktionsleiste. Der Fehler tritt in der Version 2.3.3 von Android auf. Ich glaube, das liegt daran, dass in dieser Version (und in anderen Versionen) der gesamte Actionbar-Code der Kompatibilitätscode ist.Nullpointer bei der Verwendung von benutzerdefinierten Adapter in der Actionbar-Liste Menü (mit dem compat-v7)

Wenn ich auf der Liste klicken Sie im Menü (am ActionBar) meine App abstürzt und ich die folgende Fehlermeldung bei logcat:

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) 

Hier ist die xml der Drop-Down-Zelle (so genannte item_menu_dropdown_celula.xml):

<?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> 

Und hier ist der Code des Spinners Adapter:

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); 
     } 
    } 
} 

In die Aktivität, ich habe das Menü und seinen Adapter mit dem Code:

//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); 

Weitere Informationen zu helfen. Wenn in meiner Tätigkeit habe ich ein Array-Adapter verwenden, wie in ...

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

Es funktioniert, wird der Fehler nicht auftreten.

Hat jemand eine Ahnung, was diesen Fehler verursacht? (Oder selbst wenn das ein Fehler von der Kompatibilitätsbibliothek selbst ist (was meine Vermutung ist, nachdem ich den Stack-Trace betrachtet habe und viele Eigenschaften von meinem XML geändert habe))

Antwort

27

Nach dem Posten dieses Problems im Android Issue Tracker I empfing eine viel bessere answer (als meine alte) von einem Android-Projekt Mitglied. Der richtige Weg, dies zu korrigieren ist die Linie für die Buchung der Lösung

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

durch die Linie

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

dank zu ersetzen! – nsL

+1

+1 ... Wirklich gut. Habe meine Zeit gerettet. – AndroidHacker

Verwandte Themen