我在理解Android上下文菜单的工作原理时遇到了很多麻烦。我正在编写一个简单的程序,它将在列表视图中显示不同类型的冰淇淋列表。当用户“点击并保持每种类型时,上下文菜单应该出现4个选项,询问他们想要显示哪些关于该冰淇淋的信息(图片,成分,订单,其他)。
我不明白如何制作它,以便每个列表项的上下文菜单提供相应的信息(与用户点击并保持的任何列表项相关联的信息)。
我正在从我的老师给出的示例开始工作,该示例具有我所遵循的一些功能,但不处理为每个列表项显示不同信息的问题。我看到在给定的代码中,我的教授甚至在onCreateContextMenu()的参数中给出了一个提示:
public void onCreateContextMenu( //called each time the context menu is requested
ContextMenu menu, //the ContextMenu itself
View v, //The view for which the context menu is being built
ContextMenu.ContextMenuInfo menuInfo) { //tells you which item in the list the user did the tap-and-hold over
但是我仍然不确定我能用这个参数做什么,而且我已经旋转了很长一段时间了。 stackoverflow上至少有一个其他线程可以解决这个问题,但它并没有帮助我更接近理解这里发生了什么。
我真的非常感谢他的帮助,因为我是Android的新手(通常是OOP),并且因为害怕公众嘲笑或被视为利用社区而有点犹豫不决。我只希望在某些时候我能够将它付给其他人。
谢谢!
这是我的代码:
package CS285.Assignment2;
import android.app.Activity;
import android.os.Bundle;
import android.app.ListActivity;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class IceCreamMenu extends ListActivity {
TextView selection;
ImageView imgView;
String[] items={"Butter Pecan", "Chocolate",
"Coffee", "Mango",
"Rocky Road","Strawberry",
"Vanilla"};
int[] images={R.drawable.butterpecan,
R.drawable.choclate,
R.drawable.coffee,
R.drawable.mango,
R.drawable.rockyroad,
R.drawable.strawberry,
R.drawable.vanilla};
public static final int IMG_ID = 0;
public static final int INGR_ID = 1;
public static final int ORDER_ID = 2;
public static final int OTHER_ID = 3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
selection=(TextView)findViewById(R.id.selection);
imgView = (ImageView)findViewById(R.id.Image);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
items));
registerForContextMenu(getListView()); //indicate that the ListView has a context menu.
}
//event handling for ListItemClick events
public void onListItemClick(ListView parent, View v,
int position, long id) {
selection.setText(items[position]);
}
@Override
public void onCreateContextMenu( //called each time the context menu is requested
ContextMenu menu, //the ContextMenu itself
View v, //The view for which the context menu is being built
ContextMenu.ContextMenuInfo menuInfo) { //tells you which item in the list the user did the tap-and-hold over
populateMenu(menu);
}
private void populateMenu(Menu menu) {
menu.add(Menu.NONE, IMG_ID, Menu.NONE, "Picture");
menu.add(Menu.NONE, INGR_ID, Menu.NONE, "Ingredients");
menu.add(Menu.NONE, ORDER_ID, Menu.NONE, "Order");
menu.add(Menu.NONE, OTHER_ID, Menu.NONE, "Other");
}
private boolean applyMenuChoice(MenuItem item) {
switch (item.getItemId()) {
case IMG_ID:
imgView.setImageResource(images[0]);
return(true);
case INGR_ID:
return(true);
case ORDER_ID:
return(true);
case OTHER_ID:
return(true);
}
return(false);
}
//called whenever an item in a ContextMenu is selected.
@Override
public boolean onContextItemSelected(MenuItem item) { //item is the menu item chosen
return(applyMenuChoice(item) ||
super.onContextItemSelected(item));
}
}
答案 0 :(得分:3)
简短的回答是将menuInfo转换为AdapterContextMenuInfo对象,然后访问其公共位置成员变量
selectedPostion = ((AdapterView.AdapterContextMenuInfo)menuInfo).position;
selectedPostion的值是ListView中长按的位置。
Android开发人员指南中的这篇文章对如何使用ContextMenuInfo对象有一个很好的描述,必读:
http://developer.android.com/guide/topics/ui/menus.html#context-menu
正如您在onCreate()方法中看到的那样,ListView正在注册自己以响应长按并生成ContextMenu。因此,当您长按ListView中的View项时,ListView将使用menuInfo参数提供onCreateContextMenu方法。此参数包含有关如何生成ContextMenu的信息。
http://developer.android.com/reference/android/view/ContextMenu.ContextMenuInfo.html
ListView扩展了AdapterView类。其中有AdpterView.AdapterContextMenuInfo子类。只要长按ListView对象,它就会设置此参数,其中包含有关长对象的View对象的信息。然后,此对象将传递给onCreateContextMenu(...)方法。
http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html
答案 1 :(得分:0)
您无法在上下文菜单中执行点击并按住功能。听起来你想要的是一个对话框。