Пожалуйста, помогите мне настроить контекстное меню в AlertDialog - PullRequest
0 голосов
/ 14 ноября 2010

Я работал над этим весь день, и я действительно близок, но просто не могу заставить это работать. У меня есть кнопка, которая вызывает AlertDialog, заполненный сохраненными записями, которые включают Имя и Цена. Прямо сейчас я могу щелкнуть элемент в диалоговом окне и автоматически заполнить его в полях «Имя» и «Цена». Я также хочу иметь возможность долго нажимать на элемент и получать возможность удалить его. Это моя первая попытка в приложении для Android, и многое из этого перенастроено из учебника Notepad. Две вещи, которые я не могу понять:

1) Достаточно ли корректно мой registerForContextMenu?

2) Что я делаю не так с моим onCreateContextMenu?

Спасибо.

savedItems.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {

      cDbHelper.open();
      mNotesCursor = cDbHelper.fetchAllSaved();
            startManagingCursor(mNotesCursor);

            // Create an array of names and corresponding prices from db
            String[] from = new String[]{SavedItemsDbAdapter.KEY_NAME, SavedItemsDbAdapter.KEY_PRICE};

            // and an array of the fields we want to bind those fields to
            int[] to = new int[]{R.id.text1, R.id.text2};

            // Now create a simple cursor adapter and set it to display
            SimpleCursorAdapter saved = 
                 new SimpleCursorAdapter(NewEntry.this, R.layout.saved_row, mNotesCursor, from, to);

      // Build an AlertDialog to hold this list
            AlertDialog.Builder builder = new AlertDialog.Builder(NewEntry.this);
      builder.setTitle("Choose from list");
      // IS THIS SUFFICIENT TO REGISTER FOR CONTEXT MENU?
      registerForContextMenu(v);
      builder.setAdapter(saved, new DialogInterface.OnClickListener() {

       // When an item from the list is clicked, it automatically populates the name and price fields in activity
       @Override
       public void onClick(DialogInterface dialog, int item) {
 Cursor c = mNotesCursor;
       c.moveToPosition(item);
 Intent i = new Intent(NewEntry.this, NewEntry.class);
       i.putExtra("name", c.getString( 
         c.getColumnIndexOrThrow(SavedItemsDbAdapter.KEY_NAME)));
       i.putExtra("price", c.getString(
         c.getColumnIndexOrThrow(SavedItemsDbAdapter.KEY_PRICE)));
       startActivityForResult(i, ACTIVITY_AUTO);
       finish();
}

      // TRYING AND FAILING TO SET UP A CONTEXT MENU - the goal is to be able to long press, 
      // have a "Delete?" option pop up, which will delete the entry when clicked 
      @Override
      public void onCreateContextMenu(ContextMenu menu, View v,
    ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, DELETE_ID, 0, R.string.menu_delete);
   }

   public boolean onContextItemSelected(MenuItem item) {

    switch(item.getItemId()) {
       case DELETE_ID:
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        mDbHelper.deleteItem(info.id);
        return true;
    }
    return false;
   }
      });

      AlertDialog alert = builder.create();

         alert.show();

        }

     });

    }

Ответы [ 3 ]

1 голос
/ 07 мая 2011

Я только что нашел

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {

должен быть вызван, но не

@Override
public boolean onContextItemSelected(MenuItem item) {

в моем подклассе AlertDialog:

public class MyAlertDialog extends AlertDialog implements
OnCreateContextMenuListener {

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

1 голос
/ 26 июня 2013

Вам нужно только реализовать следующую функцию.Это будет работать.

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) 
{
    Log.e(LOGTAG, "Tao menu");
    if(v == expList)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        //AdapterContextMenuInfo aInfo = (AdapterContextMenuInfo) menuInfo;

        // We know that each row in the adapter is a Map
        //HashMap map =  (HashMap) simpleAdpt.getItem(aInfo.position);
        menu.setHeaderTitle("Options");
        menu.add(1, 1, 1, "Reprint");
        menu.add(1, 2, 1, "Void");

        menu.getItem(0).setOnMenuItemClickListener(new OnMenuItemClickListener()
        {
            public boolean onMenuItemClick(MenuItem clickedItem)
            {
                return true;
            }
        });

        menu.getItem(1).setOnMenuItemClickListener(new OnMenuItemClickListener()
        {
            public boolean onMenuItemClick(MenuItem clickedItem)
            {
                return true;
            }
        });
    }
}
0 голосов
/ 14 ноября 2010

Достаточно ли корректно мой registerForContextMenu?

Вы регистрируете контекстное меню для того, что savedItems есть. Если вы хотите включить контекстное меню, значит, все в порядке.

Если ваша цель - создать контекстное меню для элементов списка в диалоговом окне, ваш подход неверен. Вы не сможете использовать AlertDialog.Builder. Вам нужно будет создать собственный подкласс AlertDialog, чтобы вы могли переопределить onCreateContextMenu() там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...