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

时间:2015-01-27 10:09:35

标签: android spinner popupmenu

在我的应用程序中,我有一个微调器,用户用电话号码填充它。

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

因此,在旋转器处于空白状态时,选项编辑&启用删除(在xml文件中定义), 但是在将项目添加到微调器后,我希望启用的选项可用,以便用户可以选择它们。

我尝试了一些我找到的代码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>

2 个答案:

答案 0 :(得分:1)

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

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

PopupMenu中的语句中删除classtype ShowMenu

其次,在ShowAlertDialog中,您没有从弹出对象(弹出菜单)中获取Menu对象,而是将其分配给popupMenu对象(类型为Menu)。因此,您的setEnabled代码不执行任何操作。

 popupMenu = popup.getMenu();  

编码时应使用Eclipse等IDE。它将标记所有这些错误。

答案 1 :(得分:0)

一开始我定义了编辑&amp;删除 spinner_action.xml

中的选项

to: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);

        }
    });

}

并且用户第一次填充微调器后,他可以再次显示popupMenu并选择其他选项。但是当用户点击按钮显示popupMenu这个代码将被执行时,这是错误的:

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"取消了showAlertDialog()中的操作。

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

showPopup我检查了adapter.getCount - 如果等于0表示 - 在<微调器中没有 项目)所以我应该启用编辑&amp;删除选项,但如果adapter.getCount大于0 - 我将enabled设置为true,现在这些项目可用。

这是我的最终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();
    }