Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android菜单:如何在代码中随条件动态更改菜单_Android_Android Optionsmenu - Fatal编程技术网

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()
,一切正常,谢谢