代码之家  ›  专栏  ›  技术社区  ›  Andriy Drozdyuk Pickels

动态上下文菜单选项

  •  1
  • Andriy Drozdyuk Pickels  · 技术社区  · 15 年前

    我的意思是,例如,如果我有一个项目列表,它可以有两种状态:“已读”和“未读”。我希望能够打开一个上下文菜单,对于未读的项目可以选择“标记为已读”,对于已读的项目可以选择“标记为未读”。

    所以点击:

    > read
    > unread <-- click
    > read 
    

    > read
    > read
    > read   <-- click
    

    将显示“标记为未读”菜单。

    在显示上下文菜单之前,是否有一些函数允许我自定义上下文菜单的创建?

    欢迎任何帮助!

    2 回复  |  直到 15 年前
        1
  •  5
  •   Cristian    15 年前

    由于您不提供代码,这是基本方法:

    @Override
    public void onCreateContextMenu(ContextMenu contextMenu,
                                    View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        AdapterView.AdapterContextMenuInfo info =
                (AdapterView.AdapterContextMenuInfo) menuInfo;
    
        String actionString = "Mark as Read";
    
        // if it's alredy read
        if ( ((TextView) info.targetView).getText().toString().equals("read") )
            actionString = "Mark as Unread";
    
        menu.setHeaderTitle("Action");
        menu.add(0, 0, 0, actionString);
    }
    

    在本例中,我假设列表中填充了 TextView ContextMenu.ContextMenuInfo

    另外,要读取所选项目的状态,可以使用 item.getMenuInfo() 方法内部 onContextItemSelected(MenuItem item) 方法。

        2
  •  2
  •   Qwertie    13 年前

    我的方法是创建两个单独的菜单项,“标记为已读”和“标记为未读”,然后在显示菜单时隐藏其中一个:

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        if (<is unread>)
            menu.findItem(R.id.mark_unread).setVisible(false);
        else
            menu.findItem(R.id.mark_read).setVisible(false);
    }
    

    直接从代码中设置文本(尤其是读取文本)是脆弱的;文本可能会更改,如果要支持多种语言怎么办?