Android菜单:如何在代码中随条件动态更改菜单
我正在尝试更改选项菜单中的项目,具体取决于活动中是否有选定的名称(来自微调器),我尝试在Android菜单:如何在代码中随条件动态更改菜单,android,android-optionsmenu,Android,Android Optionsmenu,我正在尝试更改选项菜单中的项目,具体取决于活动中是否有选定的名称(来自微调器),我尝试在Spinner.setOnItemSelectedListener中使用InvalidateOptions功能表() 然后在onprepareOptions功能表中设置我的条件,但我得到一个错误: “java.lang.ClassCastException:com.android.internal.view.menu.ActionMenuItemView不能强制转换为android.view.MenuItem
Spinner.setOnItemSelectedListener中使用InvalidateOptions功能表()
然后在onprepareOptions功能表中设置我的条件,但我得到一个错误:
“java.lang.ClassCastException:com.android.internal.view.menu.ActionMenuItemView不能强制转换为android.view.MenuItem”
我的代码:
public class MainActivity extends Activity {
private long projectId;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
datasource = new StatementDataSource(this);
datasource.open();
setContentView(R.layout.activity_main);
//setting a spinner with simpleCursorAdapter
...
public void onItemSelected(AdapterView<?> parent, View view, int position, long id){
projectId = id;
//trigger OptionsMenu to recreate
invalidateOptionsMenu();
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
private String phoneNumber = datasource.getPhoneNumber(projectId);
//checking if selected name has a phone number in the database
if (!phoneNumber.isEmpty()){ //values might be null or empty
menu.findItem(R.id.callButton).setVisible(true);
} else {
menu.findItem(R.id.callButton).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
公共类MainActivity扩展活动{
私人长投射;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
datasource=新语句datasource(此);
datasource.open();
setContentView(R.layout.activity_main);
//使用simpleCursorAdapter设置微调器
...
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
projectd=id;
//要重新创建的触发器选项菜单
无效操作菜单();
}
}
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
私有字符串phoneNumber=datasource.getPhoneNumber(projectId);
//检查所选名称在数据库中是否有电话号码
如果(!phoneNumber.isEmpty()){//值可能为null或空
menu.findItem(R.id.callButton).setVisible(true);
}否则{
menu.findItem(R.id.callButton).setVisible(false);
}
返回super.onPrepareOptions菜单(菜单);
}
我可能错了,但我认为您不需要调用无效操作菜单();
。只需设置on prepareOptions菜单()
应该可以工作,因为每次显示菜单时都会调用它。您是否试图在菜单内更新菜单?@BinaryJudy但我想根据在微调器中选择的项目动态更改此项目
@E您可能已经知道这一点,但来自:每次显示菜单之前,都会调用此方法。您可以使用此方法有效地启用/禁用项目或动态修改内容。“根据这一点,你应该能够动态修改菜单,下次显示它时,它将是你想要的。错误似乎与你显示的不符。你能提供更多的代码和/或LogCat吗?@BinaryJudy你是对的,它工作了,只是出了一个不同的问题,它是由!phoneNumber.isEmpty()引起的。”
它在一些记录上抛出了一个NullPointerExceptioin
,所以我注意到不要依赖String.isEmpty()
我做了datasource.getPhoneNumber(projectId)!=null&&!datasource.getPhoneNumber(projectId).isEmpty()
,一切正常,谢谢