弹出菜单项中的 SetEnabled(true) 不起作用

SetEnabled(true) in Popup Menu items is not working

在我的应用程序中,我有一个微调器,用户可以在其中填充 phone 个数字。

用户有 3 个选项:添加 - 编辑 - 删除。为了显示我使用的选项 popupMenu

所以,在开始时当微调器为空时,选项 Edit & Delete 被启用(定义在 xml 文件), 但是在将项目添加到微调器之后,我希望启用的选项可用,以便用户可以 select 它们。

我尝试了一些找到的代码 here 但它不起作用。

下面是我的完整代码。 谢谢!!!

MainActivity.java

public class EachApartInList extends ActionBarActivity implements OnMenuItemClickListener{
    Spinner spinner;
    ArrayAdapter<String> adapter;
    Menu popupMenu;
    PopupMenu popup;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.each_apart_in_list);
        spinner =(Spinner)findViewById(R.id.spinner1);

        adapter = new ArrayAdapter<String>(
                getBaseContext(), android.R.layout.simple_spinner_item);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner.setAdapter(adapter);

    }

    public void ShowMenu(View v){

        PopupMenu popup = new PopupMenu(this, v);

        // This activity implements OnMenuItemClickListener
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.spinner_action);
        popup.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem arg0) {
        int id;
        switch(id = arg0.getItemId()){
        case R.id.menu_add:
            showAlertDialog();
            break;
        case R.id.menu_edit:
            break;
        case R.id.menu_delete:
            break;

        }
        // TODO Auto-generated method stub
        return false;
    }

    void showAlertDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        final EditText phoneNum = new EditText(this);
        phoneNum.setInputType(InputType.TYPE_CLASS_PHONE);
        builder.setView(phoneNum)
        .setTitle("Add number")
        .setMessage("Enter the number here :");
        // Set up the buttons
        builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String newPhoneNum  = phoneNum.getText().toString();

                adapter.add(newPhoneNum);
                adapter.notifyDataSetChanged();

                popupMenu.findItem(R.id.menu_edit).setEnabled(true);
                popupMenu.findItem(R.id.menu_delete).setEnabled(true);

            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        builder.show();

    }

spinner_action.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_add"
        android:icon="@drawable/app_icon"
        android:title="add"/>
    <item
        android:id="@+id/menu_edit"
         android:enabled="false" 
        android:title="edit"/>
    <item
        android:id="@+id/menu_delete"
         android:enabled="false" 
        android:title="delete"/>

</menu>

您已多次声明 PopupMenu 弹出窗口。一次全局位于 class 的顶部,第二次位于 ShowMenu 的局部。所以你有两个弹出对象。

您膨胀并显示在 ShowMenu 中创建的本地弹出菜单。在 ShowAlertDialog 中,代码与全局声明的弹出窗口一起使用,该弹出窗口没有附加膨胀视图。

ShowMenu 中的语句中删除 class 类型 PopupMenu

其次,在ShowAlertDialog中,您没有从弹出对象(弹出菜单)中获取Menu对象并将其分配给popupMenu对象(Menu类型)。因此,您的 setEnabled 代码什么都不做。

 popupMenu = popup.getMenu();  

您应该在编码时使用 IDE,例如 Eclipse。它将标记所有这些错误。

一开始我在spinner_action.xml

中定义了edit&delete选项

到 : android:enabled ="false" 并且我尝试在 showAlertDialog() 方法中以编程方式更改它们:

void showAlertDialog(){
    .
    .
    .
    builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
        @Override
        public void onClick(DialogInterface dialog, int which) {

            popupMenu.findItem(R.id.menu_edit).setEnabled(true);
            popupMenu.findItem(R.id.menu_delete).setEnabled(true);

        }
    });

}

并且在用户第一次填充微调器后他可以再次显示弹出菜单和select其他options.But这是用户点击显示弹出菜单的按钮时的错误代码将被执行:

public void ShowMenu(View v){

        PopupMenu popup = new PopupMenu(this, v);
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.spinner_action);
        popup.show();
    }

并且该函数显示 spinner_actio.xml 中的原始项目及其原始设置,因此定义 android:enabled ="false" 取消了在 [=14= 中完成的操作].

为了解决这个问题,我做了以下简单的更改:

showPopup 我检查了 adapter.getCount - 如果等于 0 意味着 - 没有 项目微调器 ) 所以我应该启用 编辑和删除 选项,但是如果 adapter.getCount 大于 0 - 我设置 enabledtrue,现在这些项目可用。

这是我的最终 ShowMenu() 代码:

public void ShowMenu(View v){

        popup = new PopupMenu(this, v);

        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.spinner_action);

        Menu popupMenuItems = popup.getMenu();

        if(adapter.getCount() == 0){
            popupMenuItems.findItem(R.id.menu_edit).setEnabled(false);
            popupMenuItems.findItem(R.id.menu_delete).setEnabled(false);
        }
        else{
            popupMenuItems.findItem(R.id.menu_edit).setEnabled(true);
            popupMenuItems.findItem(R.id.menu_delete).setEnabled(true); 
        }
        popup.show();
    }