10

Tôi đang đối mặt với ngoại lệ Nullpointer khi sử dụng phiên bản lib tương thích mới nhất (cụ thể là v18 of compat-lib, được phát hành với phiên bản Android 4.3) và sử dụng chế độ menu điều hướng trong thanh tác vụ. Lỗi xảy ra trong phiên bản 2.3.3 của android. Tôi tin rằng đó là bởi vì trong phiên bản này (và các phiên bản khác), toàn bộ mã hành động được sử dụng là mã compat-lib.Nullpointer khi sử dụng bộ điều hợp tùy chỉnh trong menu danh sách thanh tác vụ (với compat-v7)

Khi tôi bấm vào menu danh sách (tại actionbar) treo ứng dụng của tôi và tôi nhận được lỗi sau tại 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) 

Đây là xml của tế bào thả xuống (gọi là 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> 

Và đây là đoạn code của adapter spinner:

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

trong hoạt động, tôi đặt menu và bộ điều hợp của mình bằng mã:

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

Thông tin thêm để được trợ giúp. Khi nào, trong hoạt động của tôi, tôi sử dụng bộ điều hợp mảng, như trong ...

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

Nó hoạt động, lỗi không xảy ra.

Có ai có manh mối về nguyên nhân gây ra lỗi này không? (Hoặc thậm chí nếu đây là một lỗi từ bản thân khả năng tương thích lib (đó là dự đoán của tôi, sau khi nhìn vào dấu vết ngăn xếp và thay đổi rất nhiều thuộc tính của xml của tôi))

Trả lời

27

Sau khi đăng vấn đề này trong trình theo dõi vấn đề của Android I đã nhận được answer tốt hơn nhiều so với thành viên cũ của dự án Android. Cách đúng để sửa chữa này là để thay thế dòng

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

bởi dòng

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

nhờ gửi bài cho giải pháp! – nsL

+1

+1 ... Thực sự tốt. Đã lưu thời gian của tôi. – AndroidHacker

Các vấn đề liên quan