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))
nhờ gửi bài cho giải pháp! – nsL
+1 ... Thực sự tốt. Đã lưu thời gian của tôi. – AndroidHacker