单击上下文菜单

时间:2011-05-05 23:19:34

标签: android

抱歉愚蠢的问题,但我应该更改/添加该代码 - 通过点击列表视图中的项目显示上下文菜单?

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 个答案:

答案 0 :(得分:7)

此处发布的其他解决方案对我不起作用,因为我使用的是ListFragment。但是,以下解决方案似乎对ListFragment和ListActivity(或者通常只是任何旧的listview)都很有效:

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

它更加简单和优雅。实际上,这实际上就是ListView类本身如何通过长按来启动上下文菜单。

答案 1 :(得分:5)

您需要在视图上调用registerForContextMenu。

EDITED以添加对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这样的简单适配器,并使用ListActivity和默认的ListView时,你需要决定在短按下出现上下文菜单,还是能够使用longclick。

如果您对长按不感兴趣,可以通过撤消registerForContextMenu(view)中设置的标志来短按上下文菜单;

也许其他人有更多信息或更多时间来挖掘代码。

答案 2 :(得分:0)

请勿忘记在registerForContextMenu()之后添加此内容以禁用长按:

listview.setLongClickable(isRestricted());