我做了简单的菜单。
现在我该如何制作上下文菜单?
答案 0 :(得分:6)
只需在onCreate方法
中注册上下文菜单@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView)this.findViewById(R.id.textViewId);
registerForContextMenu(this.getTextView());
}
通过添加项目
在此处创建ContextMenu@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
menu.setHeaderTitle("Sample Context Menu");
menu.add(200, 200, 200, "item1");
}
在这里回复所选项目
@Override
public boolean onContextItemSelected(MenuItem item)
{
if (item.itemId() = some-menu-item-id)
{
//handle this menu item
return true;
}
… other exception processing
}
运行并获取上下文菜单:)
答案 1 :(得分:0)
编辑: 对不起,但它类似,你必须注册contextmenü的视图,然后你必须覆盖创建和选择的东西
registerForContextMenu([your view])
@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
switch (item.getItemId()){
case CONTEXT_ASSIS:
switch (item.getGroupId()){
case CONTEXT_ASSIS:
break;
}
case R.id.navi:
break;
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()){
case CONTEXT_ASSIS:
switch (item.getGroupId()){
case R.id.navi:
break;
case R.id.assis:
break;
case R.id.save_pos:
break;
case R.id.docs:
break;
}
return true;
}
// ende edit
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menutest, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
boolean ret =super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.rotate:
break;
case R.id.settings:
break;
case R.id.talk:
break;
case R.id.calendar:
break;
case R.id.speechsearch:
break;
}
return ret;
}
答案 2 :(得分:0)
尝试这个..
registerForContextMenu(Listview);
@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, 0, Menu.NONE, "Edit");
menu.add(Menu.NONE, 1, Menu.NONE,"Delete");
menu.add(Menu.NONE, 2, Menu.NONE,"Merge");
//menu.add(Menu.NONE, 3, Menu.NONE,"Delete duplicate");
}
答案 3 :(得分:0)
上下文代码菜单:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout tv = (LinearLayout)findViewById(R.id.linear);
registerForContextMenu(tv);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
{
menu.setHeaderTitle("Sample Context Menu");
menu.add("item1");
menu.add("item2");
}
public boolean onContextItemSelected(MenuItem item)
{
if (item.getTitle().toString().equals("item1"))
{
//handle this menu item
Toast.makeText(this, "Hey, you selected item1", Toast.LENGTH_SHORT).show();
}
return true;
}
}
答案 4 :(得分:0)
我可以解释轻松制作上下文菜单的步骤:-
此Github Repo的第一个克隆演示项目,并执行以下步骤。
您会发现,CircleDrag类用于拖动圆的实现。此类包含与菜单项进行交互的逻辑,并使用OnViewCrossed接口返回回调到MainActivity以重绘菜单项。
检查MainActivity.java 首先,我们初始化CircleDrag类。
private void initCircleDrag(){
final int radius = (int) getResources().getDimension(R.dimen._80sdp);
final CircleDrag circleDrag = new CircleDrag(this);
circleDrag.init(viewCircle, this, radius, indicatorViewList);}
以下方法用于创建动态菜单项。只需传递菜单项名称和图标即可。
public void createMenuItem(String text, @DrawableRes int drawableId) {
textViewList.add(createTextView(relativeParent, text));
menuItemViewList.add(createMenuItem(rlCenterView, drawableId));
indicatorViewList.add(createMenuItem(rlCenterView, R.drawable.trans_circle));
DOTS_COUNT = textViewList.size();
}
以下方法用于将菜单布局移至触摸位置。
public void setMenuItemsPosition(View parentView, View menuLayoutView, float x, float y) {
//p for parent
float pl, pr, pb, pt;
//c for child
float cl, cr, cb, ct;
int[] v1_coords = new int[2];
parentView.getLocationOnScreen(v1_coords);
pl = 0;
pr = parentView.getWidth();
pt = 0;
pb = parentView.getHeight();
cl = menuLayoutView.getX();
ct = menuLayoutView.getY();
cr = menuLayoutView.getWidth() + cl;
cb = menuLayoutView.getHeight() + ct;
if (cl < pl) {
if (ct < pt && cl < pl) {
setMenusPosition(Angle.LEFT_TOP);
} else if (cb > pb && cl < pl) {
setMenusPosition(Angle.LEFT_BOTTOM);
} else {
setMenusPosition(Angle.LEFT);
}
} else if (cr > pr) {
if (ct < pt && cr > pr) {
setMenusPosition(Angle.RIGHT_TOP);
} else if (cb > pb && cr > pr) {
setMenusPosition(Angle.RIGHT_BOTTOM);
} else {
setMenusPosition(Angle.RIGHT);
}
} else if (ct < pt) {
setMenusPosition(Angle.TOP);
} else if (cb > pb) {
setMenusPosition(Angle.BOTTOM);
} else {
setMenusPosition(Angle.CENTER);
}
}
以下方法用于根据角度绘制菜单项圆形。如果用户触摸中心菜单项,则为圆形;如果用户触摸侧面,则菜单项为该圆圈的一半;如果用户触摸屏幕的任意角度,则菜单项为该圆圈的第四。
private void setMenusPosition(Angle angle);
下面的侦听器用于在长按时显示上下文菜单视图。
relativeParent.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
public void onLongPress(MotionEvent e) {
Log.e("GestureDetector", "Longpress detected");
if (setVisible) {
rlMenuView.setVisibility(View.VISIBLE);
rlTouchLayout.setBackgroundResource(R.color.menu_background);
isLongPressDetected = true;
}
}
});
下方的侦听器用于检测触摸并在触摸点附近绘制菜单项。
relativeParent.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getX() >= getResources().getDimension(R.dimen._10sdp) && event.getX() <= relativeParent.getWidth() - getResources().getDimension(R.dimen._10sdp) &&
event.getY() >= getResources().getDimension(R.dimen._10sdp) && event.getY() <= relativeParent.getHeight() - getResources().getDimension(R.dimen._10sdp)) {
setVisible = true;
//pass touch event
viewCircle.dispatchTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastSelectedPosition = -1;
float centerX = event.getX() - rlMenuView.getWidth() / 2;
float centerY = event.getY() - rlMenuView.getHeight() / 2;
rlMenuView.setX(centerX);
rlMenuView.setY(centerY);
setMenuItemsPosition(relativeParent, rlMenuView, centerX, centerY);
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
if (lastSelectedPosition != -1) {
onMenuSelected(lastSelectedPosition, textViewList.get(lastSelectedPosition).getText().toString());
} else {
onNoMenuSelected();
}
setVisible = false;
setMenusPosition(Angle.CENTER);
rlMenuView.setVisibility(View.INVISIBLE);
rlTouchLayout.setBackgroundResource(R.color.tranparent);
hideTextViews();
break;
}
} else {
if (event.getAction() == MotionEvent.ACTION_UP) {
onNoMenuSelected();
setVisible = false;
setMenusPosition(Angle.CENTER);
rlMenuView.setVisibility(View.INVISIBLE);
rlTouchLayout.setBackgroundResource(R.color.tranparent);
hideTextViews();
}
}
return false;
}
});
以下方法用于在选择或不选择菜单项时重绘菜单项和菜单文本。
@Override
public void OnViewTouched(int flag) {
Log.d(TAG, "onSelect: ");
lastSelectedPosition = -1;
for (int i = 0; i < DOTS_COUNT; i++) {
if (flag == indicatorViewList.get(i).getId()) {
lastSelectedPosition = i;
if ((int) pos_center_view[0] > (int) indicatorViewList.get(i).getX()
&& (pos_center_view[0] - indicatorViewList.get(i).getX() > 4)) {
menuItemViewList.get(i).setX(indicatorViewList.get(i).getX() - getResources().getDimension(R.dimen._6sdp));
} else if ((int) pos_center_view[0] < (int) indicatorViewList.get(i).getX()
&& (indicatorViewList.get(i).getX() - pos_center_view[0] > 4)) {
menuItemViewList.get(i).setX(indicatorViewList.get(i).getX() + getResources().getDimension(R.dimen._6sdp));
} else {
menuItemViewList.get(i).setX(indicatorViewList.get(i).getX());
}
if ((int) pos_center_view[1] > (int) indicatorViewList.get(i).getY()
&& (pos_center_view[1] - indicatorViewList.get(i).getY() > 4)) {
menuItemViewList.get(i).setY(indicatorViewList.get(i).getY() - getResources().getDimension(R.dimen._6sdp));
} else if ((int) pos_center_view[1] < (int) indicatorViewList.get(i).getY()
&& (indicatorViewList.get(i).getY() - pos_center_view[1] > 4)) {
menuItemViewList.get(i).setY(indicatorViewList.get(i).getY() + getResources().getDimension(R.dimen._6sdp));
} else {
menuItemViewList.get(i).setY(indicatorViewList.get(i).getY());
}
textViewList.get(i).setVisibility(View.VISIBLE);
} else {
menuItemViewList.get(i).setX(indicatorViewList.get(i).getX());
menuItemViewList.get(i).setY(indicatorViewList.get(i).getY());
textViewList.get(i).setVisibility(View.INVISIBLE);
}
}
}
选择菜单项或未选择任何内容时,将调用以下方法。
@Override
public void onMenuSelected(int position, String selectedText) {
tvResult.setText(String.format("Selected Item : %s", selectedText));
}
@Override
public void onNoMenuSelected() {
// TODO when no menu selected.....
tvResult.setText(String.format("Selected Item : %s", "None"));
}
Here is GitHub Link,以获取完整的演示。