0

如果用户短按微调器的项目,我不会显示上下文菜单:

    uSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id)
        {
            Toast.makeText(getBaseContext(), "Position = " + position, Toast.LENGTH_SHORT).show();
            pos = position;
            registerForContextMenu(view); 
            openContextMenu(view);
            unregisterForContextMenu(view);
        }
    });
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info)
    {
        if(pos != -1)
        {
            menu.setHeaderTitle("Admin menu");
            menu.add("Kick");
        }       
    }
    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        if(item.getTitle()=="Kick")
        {
            Toast.makeText(getBaseContext(), "Kick: " + usrStack.get(pos), Toast.LENGTH_SHORT).show();      
        }
        return super.onContextItemSelected(item);  
    }

一切都很好,但是如果我的应用程序启动,我会看到第一个元素的上下文菜单。(您可能还记得,亲切的匿名,第一个元素显示在微调器上。所以我认为它选择了第一个元素并调用我的上下文菜单)如何仅在 onlick 上显示它?

4

1 回答 1

1

最简单的方法是在 onItemSelected 回调中添加一个布尔标志。

if (!isfirst){
    openContextMenu(spinner);                   
} else {
    isfirst = false;
}

您的微调器还会遇到第二个问题,因为默认情况下选择了第一项,单击它不会“触发”回调方法。解决此问题的方法是在列表的开头插入一个空白项,并在您的回调中检查这一点。

 if (position != 0){
    openContextMenu(spinner);                   
} else {
    // Do nothing
}

edit: I also noticed you are registering each view for the context menu every time you click an item. You only need to register the spinner once, after you've defined it, then pass the spinner as the view when you call openContextMenu(spinner)

于 2012-11-18T20:41:45.283 回答