歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 如何通過menu id來得到menu item 控件

問題的提出:

有個朋友問: 為什麼下面的代碼會失敗,得到的是空指針異常

先看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()

Copyright © Linux教程網 All Rights Reserved