Как использовать контекстное меню Android (нажмите и удерживайте) - PullRequest
2 голосов
/ 26 октября 2010

У меня много проблем с пониманием того, как работает контекстное меню Android.Я пишу простую программу, которая будет отображать список различных видов мороженого в виде списка.Когда пользователь «нажимает и удерживает на каждом типе», должно появиться контекстное меню с 4 опциями, спрашивающими, какую информацию они хотят отобразить об этом мороженом (изображение, ингредиенты, заказ, другое).не понимаю, как сделать так, чтобы контекстное меню каждого элемента списка давало соответствующую информацию (информацию, связанную с любым элементом списка, который пользователь коснулся и удерживал).

Я работаю на примере, приведенном моим учителем,который обладает некоторыми функциями, которые мне нужны, но не имеет отношения к отображению различной информации для каждого элемента списка. Я вижу, что в данном коде мой проф даже дал подсказку в комментариях в параметрах onCreateContextMenu ():

public void onCreateContextMenu( //called each time the context menu is requested
        ContextMenu menu,   //the ContextMenu itself
        View v, //The view for which the context menu is being built
        ContextMenu.ContextMenuInfo menuInfo) { //tells you which item in the list the user did the tap-and-hold over 

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

Я действительно ценю помощь, так как я новичок в Android (и в целом ООП) и немного не решаюсь задавать вопросы, опасаясь насмешек над публичной техникой или того, что меня рассматривают как преимущество сообщества.Я просто надеюсь, что в какой-то момент я смогу перевести его кому-нибудь еще.

Спасибо!

Вот мой код:

package CS285.Assignment2;

import android.app.Activity;
import android.os.Bundle;
import android.app.ListActivity;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class IceCreamMenu extends ListActivity {
    TextView selection;
    ImageView imgView;

    String[] items={"Butter Pecan", "Chocolate", 
            "Coffee", "Mango", 
            "Rocky Road","Strawberry", 
            "Vanilla"};

    int[] images={R.drawable.butterpecan,
            R.drawable.choclate,
            R.drawable.coffee,
            R.drawable.mango,
            R.drawable.rockyroad,
            R.drawable.strawberry,
            R.drawable.vanilla};

    public static final int IMG_ID = 0;
    public static final int INGR_ID = 1;
    public static final int ORDER_ID = 2;
    public static final int OTHER_ID = 3;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        selection=(TextView)findViewById(R.id.selection);
        imgView = (ImageView)findViewById(R.id.Image);

        setListAdapter(new ArrayAdapter<String>(this,
                                                android.R.layout.simple_list_item_1, 
                                                items));
        registerForContextMenu(getListView()); //indicate that the ListView has a context menu.

    }

    //event handling for ListItemClick events
    public void onListItemClick(ListView parent, View v,
                        int position, long id) {

        selection.setText(items[position]);

    }

    @Override
    public void onCreateContextMenu( //called each time the context menu is requested
            ContextMenu menu,   //the ContextMenu itself
            View v, //The view for which the context menu is being built
            ContextMenu.ContextMenuInfo menuInfo) { //tells you which item in the list the user did the tap-and-hold over 

            populateMenu(menu);

    }

    private void populateMenu(Menu menu) {
        menu.add(Menu.NONE, IMG_ID, Menu.NONE, "Picture");
        menu.add(Menu.NONE, INGR_ID, Menu.NONE, "Ingredients");
        menu.add(Menu.NONE, ORDER_ID, Menu.NONE, "Order");
        menu.add(Menu.NONE, OTHER_ID, Menu.NONE, "Other");

    }

    private boolean applyMenuChoice(MenuItem item) {
        switch (item.getItemId()) {
        case IMG_ID:

            imgView.setImageResource(images[0]);

            return(true);

        case INGR_ID:


            return(true);

        case ORDER_ID:


            return(true);

        case OTHER_ID:


            return(true);
        }

        return(false);
    }

    //called whenever an item in a ContextMenu is selected.
    @Override
    public boolean onContextItemSelected(MenuItem item) { //item is the menu item chosen
        return(applyMenuChoice(item) ||  
        super.onContextItemSelected(item));
    }


}

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

Краткий ответ - приведение menuInfo к объекту AdapterContextMenuInfo и доступ к его переменной-члену public position

selectedPostion = ((AdapterView.AdapterContextMenuInfo)menuInfo).position;

Значение selectedPostion - это позиция в ListView, которая была нажата долго.

Эта статья в Руководстве разработчика по Android содержит отличное описание работы с объектом ContextMenuInfo, которую необходимо прочитать:

http://developer.android.com/guide/topics/ui/menus.html#context-menu

Как вы можете видеть в своем методе onCreate (), ваш ListView регистрирует себя, чтобы отвечать на длинные щелчки и генерировать ContextMenu. Поэтому, когда вы долго нажимаете на элемент View в ListView, именно ListView предоставляет ваш метод onCreateContextMenu с параметром menuInfo. Этот параметр содержит информацию о том, как было сгенерировано ContextMenu.

http://developer.android.com/reference/android/view/ContextMenu.ContextMenuInfo.html

ListView расширяет класс AdapterView. Который имеет подкласс AdpterView.AdapterContextMenuInfo. Всякий раз, когда объект ListView долго щелкается, он устанавливает этот параметр с информацией о том, какой объект View долго нажимался. Затем этот объект передается методу onCreateContextMenu (...).

http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html

0 голосов
/ 26 октября 2010

Вы не можете нажать и удерживать функциональность в контекстном меню. Похоже, что вы хотите, это диалог.

...