アクティビティの1つに次のメニュー項目があるAndroidアプリケーションがあります(名前とMac番号のリストの処理に関係します):
<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);
問題は、この特定の行で実行時例外が発生することです。誰かがなぜ手がかりを持っていますか?
ログを見ると、ランタイム例外がnullポインター例外によってトリガーされていることがわかります。このようにコードを変更することにより:
MenuItem mi = (MenuItem)findViewById(R.id.sort_by_name);
mi.setChecked(true);
例外がsecondsステートメントで発生することが明らかになります。つまり、MenuItemmiがnullです。では、なぜ最初のステートメントが正しいMenuItemへのポインターをもたらすのに失敗するのでしょうか。
メニューはビューではなくメニューであるため、メニューに対してfindViewById()
を実行することはできません。また、作成中または準備中にメニューの状態を変更できます。たとえば、オプションメニューを作成する場合は、Activity: onPrepareOptionsMenu()
メソッドで作成できます。
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.sort_by_name).setChecked(true);
//Also you can do this for sub menu
menu.getItem(firstItemIndex).getSubMenu().getItem(subItemIndex).setChecked(true);
return true;
}
private boolean _isHidden = false;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.hiddenfiles:
if(!_isHidden)
{
_isHidden = true;
item.setChecked(true);
}
else {
_isHidden = false;
item.setChecked(false);
}
}
return super.onOptionsItemSelected(item);
}
このコードは、1つまたは複数のメニュー項目を使用できます。
'item' from 'public boolean onOptionsItemSelected(MenuItem item)'を使用するだけです
私はこれを使用しました、それは私のために働きました。 :)