Iga*_*gal 13 icons android menuitem android-fragments android-optionsmenu
我的选项菜单中有这个项目:
<item
android:id="@+id/opt_mnu_action"
android:icon="@android:drawable/ic_dialog_info"
android:orderInCategory="1"
android:showAsAction="ifRoom"
android:title="New">
</item>
Run Code Online (Sandbox Code Playgroud)
菜单本身在主FragmentActivity中创建.我想根据打开的Fragment以编程方式更改此项目的图标,显然,当用户点击此按钮时会有不同的操作.我尝试了几件事,但没有任何效果.我尝试的最后一件事是我的Fragment的onCreateView方法中的代码:
MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);
Run Code Online (Sandbox Code Playgroud)
但我的应用程序崩溃了.有没有办法做到这一点?
**更新**
以下是我现在要做的事情,所有这些都在我的主要主要FragmentActivity中:首先,我MenuItem action_button;在我的层次结构视图中有一个.然后在我的onCreateOptionsMenu方法中我实例化它:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
action_button = menu.findItem(R.id.opt_mnu_action);
return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了这个函数来根据打开的标签更改图标:
public void change_action_button_icon(int tab_position)
{
switch(tab_position)
{
case 0:
action_button.setIcon(R.drawable.ico_1);
break;
case 1:
action_button.setIcon(R.drawable.ico_2);
break;
case 2:
action_button.setIcon(R.drawable.ico_3);
break;
}
invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)
我用我的onTabSelected方法称它为:
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
mViewPager.setCurrentItem(tab.getPosition());
setTab_position(tab.getPosition());
change_action_button_icon(tab.getPosition());
}
Run Code Online (Sandbox Code Playgroud)
但是一旦我开始我的应用程序 - 它崩溃了.我NullPointerException在这一行得到错误:
action_button.setIcon(R.drawable.ico_1);
Run Code Online (Sandbox Code Playgroud)
我猜 - 这是因为在action_button实例化之前请求了图标更改.但我不知道如何克服它......
ksu*_*ksu 19
使用它来获取对菜单项的引用:
menu.findItem(resourceId).setIcon(drawableId);
Run Code Online (Sandbox Code Playgroud)
您必须将代码更改为onCreateOptionsMenu()中的图标.
请参考下面的示例:
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.option_menu, menu);
if (needToChangeMenuItem){
menu.findItem(resourceId).setIcon(drawableId);
}
manageMenuIcon(menu);
needToChangeMenuItem = false;
return true;
}
public void manageMenuIcon(Menu menu){
if (bluetoothIconOn){
menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothon);
} else
menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothoff);
if (gpsIconOn)
menu.findItem(R.id.gps).setIcon(R.drawable.gps);
else
menu.findItem(R.id.gps).setVisible(false);
if (slipAndDropIconOn)
menu.findItem(R.id.fall).setIcon(R.drawable.fall);
else
menu.findItem(R.id.fall).setVisible(false);
if (fesConnectIconOn)
menu.findItem(R.id.fesConnection).setIcon(R.drawable.fesconnect);
else
menu.findItem(R.id.fesConnection).setVisible(false);
}
public void changeMenuItem(int resId, int draId){
needToChangeMenuItem = true;
resourceId = resId;
drawableId = draId;
invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)
MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);
Run Code Online (Sandbox Code Playgroud)
在您的 Fragment 中onCreateOptionsMenu,加载此菜单,并保留对菜单项的引用(它不是片段视图层次结构的一部分,因此您不能使用 findViewById)。
当您准备好更新图标时,请使用mi.setIcon(R.drawable.ico_1);
并调用invalidateOptionsMenu()。
更新:
return super.onCreateOptionsMenu(menu);
这实际上会返回 false,因为基本实现不会这样做。相反,跳过它,或者只是先调用super.onCreateOptionsMenu(menu);,做你的事情,然后返回 true。
| 归档时间: |
|
| 查看次数: |
25662 次 |
| 最近记录: |