我是Android开发的新手。我正试图将上下文菜单添加到我的应用程序中。我知道默认情况下需要长时间点击按钮才能打开上下文菜单。但我需要让它出现在一次点击中。我在stackoverflow尝试了所有其他的解决方案,但没有一个能真正帮助我
我已经在下面发布了我的代码。请告诉我需要做哪些修改才能使其工作。
public class ThirdActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.third_layout);
confirmButton = (Button) findViewById(R.id.confirmButton);
registerForContextMenu(confirmButton);
}
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Select Menu");
menu.add(0, v.getId(), 0, "Action 1");
}
public boolean onContextItemSelected(MenuItem item) {
if (item.getTitle() == "Action 1") {
//do something
}
}
just :
public class ThirdActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.third_layout);
confirmButton = (Button) findViewById(R.id.confirmButton);
confirmButton .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
confirmButton .performLongClick();
}
});
registerForContextMenu(confirmButton);
}
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Select Menu");
menu.add(0, v.getId(), 0, "Action 1");
}
public boolean onContextItemSelected(MenuItem item) {
if (item.getTitle() == "Action 1") {
//do something
}
}
您可以简单地编写:
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
view.showContextMenu();
}
});
我不确定从哪个Android版本开始,调用view.showContextMenu()时行为发生了变化。我在安卓13(API 33)上,它在屏幕中间显示了一个全宽对话框,而不是出现在点击位置的通常上下文菜单。我甚至试着调用view.performLongClick(),它再次显示了新的UI样式,暗示谷歌的某个人真的想只为实际的长点击事件保留通常的上下文菜单!
我几乎放弃了,直到我发现showContextMenu()有一个重载的方法showContextMenu(x,y),它接受x-y坐标,并且似乎会创建从指定的x和y坐标派生的常规上下文菜单。
至于如何获得点击位置的x和y坐标,这是我使用的:
private var lastTouchedPositionX: Float = 0.0f
private var lastTouchedPositionY: Float = 0.0f
itemView.setOnTouchListener { view, motionEvent ->
when (motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
lastTouchedPositionX = motionEvent.x
lastTouchedPositionY = motionEvent.y
}
MotionEvent.ACTION_UP -> {
if (motionEvent.x == lastTouchedPositionX && motionEvent.y == lastTouchedPositionY) {
// item is clicked
itemView.showContextMenu(lastTouchedPositionX, lastTouchedPositionY)
}
lastTouchedPositionX = 0.0f
lastTouchedPositionY = 0.0f
}
}
true
}
我使用setOnTouchListener是因为setOnClickListener不返回x和y坐标,而setOnTouch.Listener返回,并且我假设如果ACTION_DOWN和ACTION_UP都发生在同一坐标,则意味着发生了单击事件,因此我们将showContextMenu(x,y)称为
似乎在安卓13上运行良好,但还没有测试过旧版本。