上下文菜单

     Android用ContextMenu来代表上下文菜单,为Android应用开发上下文菜单与开发选项菜单的方法基本相似,因为ContextMenu继承了Menu,因此程序可用相同的方法为它添加菜单项。

     当然,开发上下文菜单与开发选项菜单的区别在于:开发上下文菜单不是重写onCreateOptionsMenu(Menu menu)方法,而是重写onCreateContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfo menuInfo)方法。其中source参数代表触发上下文菜单的组件。

     开发上下文菜单的步骤如下。

     ①重写Activity的onCreteContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfo menuInfo)方法。

     ②调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单。

     ③如果希望应用程序能为菜单项提供相应,可以重写onContextItemSelected(MenuItem mi)方法,或为指定菜单项绑定事件监听器。

    ContextMenu提供了如下方法,同样可以为上下文菜单设置图标、标题等。

  • ContextMenu setHeaderIcon(Drawable icon):为上下文菜单设置图标。
  • ContextMenu setHeaderIcon(int iconRes):为上下文菜单设置图标。
  • ContextMenu setHeaderTitle(int titleRes):为上下文菜单设置标题。

    该程序的界面布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
   >
    <TextView
        android:id="@+id/txt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="15pt"
        android:text="可通过上下文菜单修改背景色" />
</LinearLayout>

该程序对应的后台Activity代码如下:

package org.crazyit.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class ContextMenuTest extends Activity {
       //为每个菜单定义一个标识
    final int MENU1=0x111;
    final int MENU2=0x112;
    final int MENU3=0x113;
    
    private TextView txt;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.context_menu_test);
        txt=(TextView)findViewById(R.id.txt);
        //为文本框注册上下文菜单
        registerForContextMenu(txt);//
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.context_menu_test, menu);
        return true;
    }
    //创建上下文菜单时触发该方法
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        menu.add(0,MENU1,0,"红色");
        menu.add(0,MENU2,0,"绿色");
        menu.add(0,MENU3,0,"蓝色");
        //将三个菜单项设为单选菜单项
        menu.setGroupCheckable(0, true, true);
        //设置上下文菜单的标题、图标
        menu.setHeaderIcon(R.drawable.tools);
        // TODO Auto-generated method stub
        //super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("选择背景色");
    }
    //上下文菜单的菜单项被单击时触发该方法

    @Override
    public boolean onContextItemSelected(MenuItem mi) {
        switch(mi.getItemId())
        {
        case MENU1:
            mi.setCheckable(true);
            txt.setBackgroundColor(Color.RED);
            break;
        case MENU2:
            mi.setCheckable(true);
            txt.setBackgroundColor(Color.GREEN);
            break;
        case MENU3:
            mi.setCheckable(true);
            txt.setBackgroundColor(Color.BLUE);
            break;
        }
        // TODO Auto-generated method stub
        //return super.onContextItemSelected(mi);
        return true;
    }
    
    

}

上面的程序重写了onCreateContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfo menuInfo)方法,该方法的内部为程序创建了一个上下文菜单。

   程序在①号代码除调用registerForContextMenu(txt)为txt组件(一个文本框组件)注册了上下文菜单,这意味着当用户长按该组时显示上下文菜单。上下文菜单如图所示。

    

原文地址:https://www.cnblogs.com/wolipengbo/p/3397363.html