短按上下文菜单

7

抱歉问一个愚蠢的问题,但我应该在那段代码中更改/添加什么内容,才能通过在列表视图中短按项目来显示上下文菜单?

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener {
    static final String[] COUNTRIES = new String[]{
            "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
            "Angola", "Anguilla", "Antarctica"
    };

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES));

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(this);
    }


    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        Log.e("sdklfjsdkljfl", " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ");
        menu.setHeaderTitle("HELLO");

    }

    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Log.e("kjhasjkdhkas", "sdkhjkhskaf");
        this.openContextMenu(view);
    }
}
3个回答

7

这里发布的其他解决方案对我没有用,因为我正在使用ListFragment。然而,以下解决方案似乎非常适用于ListFragment和ListActivity(或一般的listview):

public void onListItemClick(ListView l, View v, int position, long id){
  l.showContextMenuForChild(v);   
}

这更加简单优雅。实际上,这正是ListView类在长按时启动上下文菜单的方式。


5

您需要在视图上调用registerForContextMenu。

编辑后添加调用setLongClickable(false)

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    registerForContextMenu( view ); 
    view.setLongClickable(false);  // undo setting of this flag in registerForContextMenu
    this.openContextMenu(view);
}

您还需要添加菜单项,否则菜单将无法显示。仅设置标题是不够的。
注意:我还没有完全找到原因,但调用registerForContextMenu(view)会设置一个标志,假设您想要长按上下文菜单。当设置了此标志时,AbsListView中的onTouch逻辑不再触发onClick。我没有时间完全浏览此内容。似乎当使用像ArrayAdapter这样的简单适配器,并使用具有默认ListView的ListActivity时,您需要在短按上出现上下文菜单之间进行选择,或者能够使用长按。
如果您不感兴趣长按操作,则可以通过撤消registerForContextMenu(view)中设置的标志来使您的上下文菜单在短按上运行。
也许其他人有更多信息或更多时间来查看代码。

我做了这个,谢谢,但是之后-我只能调用一个列表项的上下文菜单一次-为什么? - eve
我更新了答案并提供了更多信息。但是,我不完全确定发生了什么,并且今天没有时间深入研究。我已经发布了一个可能适用于您的解决方法。 - slund

0

别忘了在registerForContextMenu()之后添加以下代码以禁用长按:

listview.setLongClickable(isRestricted());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接