2010-11-13 3 views
0

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

1) Достаточно ли/правильно ли зарегистрировано в регистре ForContextMenu?

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(); 

     } 

    }); 

    } 

ответ

0

ли мой registerForContextMenu достаточно/правильно?

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

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

+0

Благодарим за сообщение. Какую возможность вы могли бы указать мне в правильном направлении для создания пользовательского подкласса AlertDialog? Благодарю. – evanl81

+0

Я собираюсь провести ночь с этим: http://developer.android.com/guide/topics/ui/dialogs.html#CustomDialog – evanl81

+0

@ evanl81: Нет, этот образец не совсем подходит для ваших нужд. Вам необходимо создать * подклассу * * 'AlertDialog' (или' Dialog', в зависимости от того, какой из них), например http://dtmilano.blogspot.com/2010/01/android-ui-colored-dialogs.html. Вы можете найти проще использовать диалоговое «действие» ('android: theme =" @ android: style/Theme.Dialog "' в вашей манифестной записи для 'Activity'). – CommonsWare

1

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

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

называться, но не

@Override 
public boolean onContextItemSelected(MenuItem item) { 

в моем наследнике AlertDialog:

public class MyAlertDialog extends AlertDialog implements 
OnCreateContextMenuListener { 

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

0

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

@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; 
      } 
     }); 
    } 
} 
Смежные вопросы