2010-06-17 144 views
1

是否有可能在android中创建动态上下文菜单?动态上下文菜单选项

我的意思是,例如,如果我有一个项目列表,可以有两种状态:“读取”和“未读”。我希望能够为未读项目提供一个选项“标记为已读”的上下文菜单,并且为已读项目标记“未读”。

所以点击:

> read 
> unread <-- click 
> read 

将显示上下文菜单 “标记为已读”,造成:

> read 
> read 
> read <-- click 

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

是否有一些函数可以让我在显示前自定义上下文菜单的创建?

欢迎任何帮助!

回答

5

由于你没有提供的代码,这是基本的方法:

@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 s表示可以有串“读”或“未读”。正如我已经说过的,这是一个非常基本的方法。这里重要的是注意如何使用ContextMenu.ContextMenuInfo对象。

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

+0

.targetView成员代表什么?谢谢! – drozzy 2010-06-18 12:01:26

+0

在Android上构建列表时,列表中的每个项目都是“视图”。您可以使用不同类型的视图,例如简单的'TextView'(如上例)或自定义视图(例如,将外部布局转换为带有'LinearLayout'的XML,不同的'TextView',Images,等等)。 'targetView'表示您正在用来显示列表中的每个项目的'View'。 – Cristian 2010-06-18 12:35:28

1

我会做到这一点的方法是创建两个单独的菜单项,“标记为已读”和“标记为未读”,然后隐藏其中的一个,每当显示菜单:

@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); 
} 

设置直接来自代码的文本(特别是阅读文本)是脆弱的;文字可能会改变,如果您想支持多种语言,该怎么办?