上下文菜单创建

时间:2011-03-18 11:56:20

标签: android contextmenu

我做了简单的菜单。

现在我该如何制作上下文菜单?

5 个答案:

答案 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,以获取完整的演示。