个人安卓学习----ActivityのMenu菜单

周六日休息,有点懈怠了,没有学习,补充元气,继续努力,加油(*^__^*) !

要学习菜单,我们需要先知道什么是菜单,来看一下~

打开模拟器或者手机,点击menu键,如图标志位置即为菜单

如图,Android的选项菜单是默认不见的,当用户按下Menu键时程序菜单将会出现在屏幕下方。Android系统默认最多只有6个菜单位,如果超过6个菜单,系统将会在第6个菜单位显示“更多”。

如图,Android系统的菜单注意通过4个接口来体现

图画得不好,大家主要看意思啊~

Menu接口是个父接口,接口下有两个子接口。

Submenu:它代表了一个子菜单,它可以包含多个MenuItem(形成菜单项)。

ContextMenu:它代表一个上下文菜单。它也可以包含多个MenuItem。

Menu定义了如下方法来添加菜单和菜单项。

MenuItem add(int titleRes)添加一个新的菜单项。

MenuItem add(int groupId,int itemId,int order,CharSequence title)添加一个新的处于groupId组的菜单项

MenuItem add(int groupId,int itemId,int order,int titleRes)添加一个新的处于groupId组的菜单项

MenuItem add(CharSequence title)添加一个新的菜单项

SubMenu addSubMenu(int titleRes)添加一个新的子菜单

SubMenu addSubMenu(int groupId,int itemId,int order,int titleRes)添加一个新的处于groupId组的子菜单

综述:add方法用于添加菜单项,addSubMenu用于添加子菜单,这些重载方法的区别是:是否将子菜单,菜单项添加到指定菜单中,是否使用资源文件中的字符串资源来设置标题。

下面我们看一下Android程序中如何添加菜单和子菜单

我想要实现一个这样的效果,在Activity中添加一个EditText,我通过下方的Menu菜单和子菜单,完成更改字体颜色和大小的功能。如图:


好,现在我们可以看到,要实现这种效果,我们需要添加3个菜单项,在字体菜单项中我们需要添加5个子菜单项,在颜色菜单项中我们需要添加3个子菜单项,下面我们开始写代码。

我们需要做的第一步:重写Activity中的onCreateOptionsMenu(Menu menu)的方法,在该方法里调用Menu对象的方法来添加菜单项或子菜单

第二步:如果希望程序能响应菜单项的点击事件,重写Activity的onOptionsItemSelected(MenuItem mi)方法即可。

这个程序的布局文件,只是在Activity中添加了一个EditText,这里就不做展示了

Java代码:

package song.activity;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.EditText;
import android.widget.Toast;

public class MenuTestActivity extends Activity
{
	// 定义字体大小菜单项的标识
	final int FONT_10 = 0x111;
	final int FONT_12 = 0x112;
	final int FONT_14 = 0x113;
	final int FONT_16 = 0x114;
	final int FONT_18 = 0x115;
	// 定义普通菜单项的标识
	final int PLAIN_ITEM = 0x11b;
	// 定义字体颜色菜单项的标识
	final int FONT_RED = 0x116;
	final int FONT_BLUE = 0x117;
	final int FONT_GREEN = 0x118;
	
	private EditText edit;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		edit = (EditText) findViewById(R.id.txt);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// -------------向menu中添加字体大小的子菜单-------------
		SubMenu fontMenu = menu.addSubMenu("字体大小");
		// 设置菜单的图标
		fontMenu.setIcon(R.drawable.font);
		// 设置菜单头的图标
		fontMenu.setHeaderIcon(R.drawable.font);
		// 设置菜单头的标题
		fontMenu.setHeaderTitle("选择字体大小");		
		fontMenu.add(0, FONT_10, 0, "10号字体");
		fontMenu.add(0, FONT_12, 0, "12号字体");
		fontMenu.add(0, FONT_14, 0, "14号字体");
		fontMenu.add(0, FONT_16, 0, "16号字体");
		fontMenu.add(0, FONT_18, 0, "18号字体");
		// -------------向menu中添加普通菜单项-------------
		menu.add(0, PLAIN_ITEM, 0, "普通菜单项");
		// -------------向menu中添加文字颜色的子菜单-------------
		SubMenu colorMenu = menu.addSubMenu("字体颜色");
		colorMenu.setIcon(R.drawable.color);
		// 设置菜单头的图标
		colorMenu.setHeaderIcon(R.drawable.color);
		// 设置菜单头的标题
		colorMenu.setHeaderTitle("选择文字颜色");	
		colorMenu.add(0, FONT_RED, 0, "红色");
		colorMenu.add(0, FONT_GREEN, 0, "绿色");
		colorMenu.add(0, FONT_BLUE, 0, "蓝色");
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	// 菜单项被单击后的回调方法
	public boolean onOptionsItemSelected(MenuItem mi)
	{
		//判断单击的是哪个菜单项,并针对性的作出响应。
		switch (mi.getItemId())
		{
			case FONT_10:
				edit.setTextSize(10 * 2);
				break;
			case FONT_12:
				edit.setTextSize(12 * 2);
				break;
			case FONT_14:
				edit.setTextSize(14 * 2);
				break;
			case FONT_16:
				edit.setTextSize(16 * 2);
				break;
			case FONT_18:
				edit.setTextSize(18 * 2);
				break;
			case FONT_RED:
				edit.setTextColor(Color.RED);
				break;
			case FONT_GREEN:
				edit.setTextColor(Color.GREEN);
				break;
			case FONT_BLUE:
				edit.setTextColor(Color.BLUE);
				break;
			case PLAIN_ITEM:
				Toast toast = Toast.makeText(MenuTestActivity.this
					, "您单击了普通菜单项" , Toast.LENGTH_SHORT);
				toast.show();
				break;
		}
		return true;
	}
}

如图,大家看到我所有的代码都是在Java中完成的,那么如何利用 xml定义选项菜单呢?
android.view.MenuInflater  

This class is used to instantiate menu XML files into Menu objects.这个类被用来使菜单xml文件实例化为菜单对象

首先我们新建一个menu文件夹,在其中新建一个option_menu.xml文件,文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
	<item 
	    android:id="@+id/font"
	    android:icon="@drawable/font"
	    android:title="设置字体大小"
	    android:titleCondensed="字体大小">
	    <menu >
            <item android:id="@+id/FONT_10"
                android:title="10号字体" />
            <item android:id="@+id/FONT_12"
                android:title="12号字体" />
            <item android:id="@+id/FONT_14"
                android:title="14号字体" />
            <item android:id="@+id/FONT_16"
                android:title="16号字体" />
            <item android:id="@+id/FONT_18"
                android:title="18号字体" />
        </menu>
	</item>
	<item android:id="@+id/normal"
	    android:title="普通菜单项"/>
    <item 
        android:id="@+id/color"
        android:icon="@drawable/color"
        android:title="字体颜色">
	     <menu>
	         <item android:id="@+id/FONT_RED"
                android:title="红色" />
	         <item android:id="@+id/FONT_GREEN"
                android:title="黄色" />
	         <item android:id="@+id/FONT_BLUE"
                android:title="绿色" />
	     </menu>
	</item>    

</menu>
Activity的Java文件:
package song.activity;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.widget.EditText;
import android.widget.Toast;

public class MenuTestActivity extends Activity implements OnMenuItemClickListener
{
	
	private EditText edit;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		edit = (EditText) findViewById(R.id.txt);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		MenuInflater inflater = this.getMenuInflater();
    	inflater.inflate(R.menu.option_menu, menu);
    	
    	for(int i=0; i<menu.size(); i++){
    		menu.getItem(i).setOnMenuItemClickListener(this);
    	}
    	
    	SubMenu smenu1 = menu.findItem(R.id.font).getSubMenu();
    	
    	for(int i=0; i<smenu1.size(); i++){
    		smenu1.getItem(i).setOnMenuItemClickListener(this);
    	}
    	SubMenu smenu2 = menu.findItem(R.id.color).getSubMenu();
    	
    	for(int i=0; i<smenu2.size(); i++){
    		smenu2.getItem(i).setOnMenuItemClickListener(this);
    	}
    	
    	return true;
		
	}

	
	@Override
	public boolean onMenuItemClick(MenuItem mi) {
		//判断单击的是哪个菜单项,并针对性的作出响应。
				switch (mi.getItemId())
				{
					case R.id.FONT_10:
						edit.setTextSize(10 * 2);
						break;
					case R.id.FONT_12:
						edit.setTextSize(12 * 2);
						break;
					case R.id.FONT_14:
						edit.setTextSize(14 * 2);
						break;
					case R.id.FONT_16:
						edit.setTextSize(16 * 2);
						break;
					case R.id.FONT_18:
						edit.setTextSize(18 * 2);
						break;
					case R.id.FONT_RED:
						edit.setTextColor(Color.RED);
						break;
					case R.id.FONT_GREEN:
						edit.setTextColor(Color.GREEN);
						break;
					case R.id.FONT_BLUE:
						edit.setTextColor(Color.BLUE);
						break;
					case R.id.normal:
						Toast toast = Toast.makeText(MenuTestActivity.this
							, "您单击了普通菜单项" , Toast.LENGTH_SHORT);
						toast.show();
						break;
				}
				return true;
	}
}
其中
public boolean onCreateOptionsMenu(Menu menu)
	{
		MenuInflater inflater = this.getMenuInflater();
    	inflater.inflate(R.menu.option_menu, menu);
    	
    	for(int i=0; i<menu.size(); i++){
    		menu.getItem(i).setOnMenuItemClickListener(this);
    	}
    	
    	SubMenu smenu1 = menu.findItem(R.id.font).getSubMenu();
    	
    	for(int i=0; i<smenu1.size(); i++){
    		smenu1.getItem(i).setOnMenuItemClickListener(this);
    	}
    	SubMenu smenu2 = menu.findItem(R.id.color).getSubMenu();
    	
    	for(int i=0; i<smenu2.size(); i++){
    		smenu2.getItem(i).setOnMenuItemClickListener(this);
    	}
    	
    	return true;
		
	}

为将xml文件转化的代码


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值