SetEnabled (true) в пунктах всплывающего меню не работает

В моем приложении у меня есть счетчик, который пользователь заполняет телефонными номерами.

У пользователя есть 3 варианта: Добавить - Изменить - Удалить. Для отображения параметров я использовал popupMenu.

Итак, вначале, когда счетчик пуст, параметры Редактировать и Удалить включены (определены в файле xml), но после добавления элемента в счетчик мне нужны включенные параметры. быть доступными, чтобы пользователь мог их выбрать.

Я попробовал код, который нашел здесь, но он не работает.

Ниже мой полный код. Спасибо!!!

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>

person Josef    schedule 27.01.2015    source источник


Ответы (2)


Вы объявили всплывающее окно PopupMenu более одного раза. Один раз глобально в верхней части класса и второй раз локально в ShowMenu. Итак, у вас есть два всплывающих объекта.

Вы надуваете и показываете локальное всплывающее меню, созданное в ShowMenu. В ShowAlertDialog код работает с глобально объявленным всплывающим окном, к которому не прикреплено расширенное представление.

Удалите тип класса PopupMenu из инструкции в ShowMenu.

Во-вторых, в ShowAlertDialog вы не получили объект Menu из всплывающего объекта (всплывающее меню) и не присвоили его объекту popupMenu (типа Menu). Таким образом, ваш код setEnabled ничего не делает.

 popupMenu = popup.getMenu();  

При кодировании следует использовать IDE, например Eclipse. Он будет помечать все эти ошибки.

person Reenactor Rob    schedule 27.01.2015
comment
Спасибо @Reenactor Роб за ваш ответ. Вы правы, у меня есть ошибки, которые вы упомянули, я изменил свой код, как вы написали, но это не сработало. У меня была логическая проблема в моем коде, поэтому, подумав над этим, я нашел решение - и я разместил его ниже, в любом случае, спасибо !!! - person Josef; 27.01.2015

Вначале я определил параметры редактировать и удалить в файле spinner_action.xml.

на: 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);

        }
    });

}

и после того, как пользователь впервые заполнил счетчик, он может снова отобразить всплывающее меню и выбрать другие параметры. Но это ошибка, когда пользователь нажимает кнопку для отображения всплывающего меню, этот код будет выполнен:

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 (означает - нет элементов в счетчике), поэтому я должен включить параметры редактировать и удалить , но если 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();
    }
person Josef    schedule 27.01.2015
comment
Рад, что смог немного помочь. Я делаю такие ошибки чаще, чем хочу признать. - person Reenactor Rob; 28.01.2015