有個朋友問: 為什麼下面的代碼會失敗,得到的是空指針異常
先看menu.xml 文件的內容
<item Android:id="@+id/menu_sort_tagg" android:icon="@android:drawable/ic_menu_sort_by_size" android:title="@string/menu_sort_list" > <menu> <group android:checkableBehavior="single"> <item android:id="@+id/sort_by_name" android:title="@string/sort_by_name" /> <item android:id="@+id/sort_by_mac" android:title="@string/sort_by_mac" /> </menu> </item>
代碼中如下處理:
((MenuItem)findViewById(R.id.sort_by_name)).setChecked(true);
或通過MenuItem mi = (MenuItem)findViewById(R.id.sort_by_name); mi.setChecked(true);
系統都會報告空指針異常 “ MenuItem mi is null”
我們不能將findViewById()用於menu ,因為他是menu,不是view. 我們可以更改menu的狀態,只有它已經被創建或是被准備( created or prepared)好後才行。
解決辦法:
Activity: onPrepareOptionsMenu() 等方法來處理
@Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.sort_by_name).setChecked(true); return true; }
或
@Override
publicboolean onMenuOpened(int featureId, Menu menu) {
//TODO Auto-generated method stub
menu.findItem(R.id.sort_by_name).setChecked(true);
returnsuper.onMenuOpened(featureId, menu);
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.menu, menu);
menu.findItem(R.id.sort_by_name).setChecked(true);
}
以上三種方法之一調用。
絕對不能用findViewById()