Android之路之六(菜单的实现)

今天,学习了Android 菜单的实现。

Android提供了三种菜单类型:options menucontextmenusub menu

optionsmenu(即主菜单),是通过按home键来显示的;contextmenu(右键菜单),是在view上按2s后显示的。两者menu都可以加入sub menu(子菜单),而子菜单不能嵌套菜单。

Android提供了对菜单项进行分组的功能,可以将相似功能的菜单项分为同一组,这就可以通过调用setGroupCheckablesetGroupEnabledsetGroupVisible来设置菜单属性。

下面通过实例来了解Android菜单:

首先,在利用xml定义选项菜单,首先来实现optionsmenu(主菜单)的实现:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
	<item android:id="@+id/newFile"
	    android:icon="@drawable/ic_launcher"
	    android:title="@string/newFile_title"   />
	<item android:id="@+id/exit"
	    android:icon="@drawable/ic_launcher"
	    android:title="@string/exit_title" />
</menu>

 

然后建立Activity.java文件:

package cn.class3g.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.widget.Toast;

public class MenuTestActivity1 extends Activity implements OnMenuItemClickListener{

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    public boolean onCreateOptionsMenu(Menu menu){
    	MenuInflater inflater = this.getMenuInflater();
    	inflater.inflate(R.menu.options_menu, menu);
    	return true;
    }
	public boolean onMenuItemClick(MenuItem item) {
		switch(item.getItemId()){
		case R.id.newFile:
			Toast.makeText(this, "new file", Toast.LENGTH_LONG).show();//显示一条文字
			break;
		case R.id.exit:
			this.finish();//实现退出
			break;
		}
		
		return false;
	}

}

然后启动Android虚拟机:

Ok,options menu(主菜单)成功实现,这里需要解释的是:options menu通过Activity的onCreateOptionsMenu来生成。且,这个函数只会在menu第一次生成时调用。(注:若想改变options menu的想法只能在onPrepareOptionsMenu来实现,其会在menu显示前调用)onOptionsItemSelected用来处理选中的菜单项。

其次,同样的利用xml来实现contextmenu(右键菜单)的实现:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/menuitem1"
        android:title="menuitem1"/>
    <item
        android:id="@+id/menuitem2"
        android:title="menuitem2">
        <menu>
            <item android:id="@+id/subitem1"
                android:title="subitem1" />
            <item android:id="@+id/subitem2"
                android:title="subitem2" />
        </menu>
    </item>
</menu>

然后在Activity.java文件中实现如下代码:

package cn.class3g.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;

public class MenuTestActivity3 extends Activity {
	
	private static final int SUBMENU = 10;
	private static final int SUBITEM1 = SUBMENU+1;
	private static final int SUBITEM2 = SUBMENU+2;
	private static final int SUBITEM3 = SUBMENU+3;
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    //只在选项菜单第一次显示时调用
    public boolean onCreateOptionsMenu(Menu menu){
    	MenuInflater inflater = this.getMenuInflater();
    	inflater.inflate(R.menu.sub_menu, menu);    
    	
    	SubMenu subMenu = menu.addSubMenu(1,SUBMENU, 1, "子菜单");
    	subMenu.add(20,SUBITEM1,1, "subitem1");
    	subMenu.add(20,SUBITEM2,2, "subitem2");
    
    	subMenu.add(30,SUBITEM3,3, "subitem3");
    	
    	subMenu.setGroupCheckable(20, true,true);
    	
    	MenuItem item = subMenu.getItem(0);
    	item.setChecked(true);
    	
    	subMenu.findItem(SUBITEM3).setCheckable(true);
    	return true;
    }
    
	public boolean onOptionsItemSelected(MenuItem item) {
	switch(item.getItemId()){
	case R.id.menuitem1:
		Toast.makeText(this, "new file", Toast.LENGTH_LONG).show();
		break;
	case R.id.menuitem2:
		break;
	case SUBITEM1:
		break;
	case SUBITEM2:
		this.finish();
		break;
	}
	return true;
	}   
}

 

启动Android虚拟机:

点击子菜单,弹出子菜单的菜单项:

Ok,context menu(右键菜单)实现。这里,响应菜单项单击时间的三种方法为:onMenuItemSelected(int featureId, MenuItemitem) 、public boolean onOptionsltemSelected(Menultemitem)、onMenuItemClick

 

然后,利用xml来实现sub menu(子菜单)的实现:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/textView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
</LinearLayout>


 

然后在Activity.java文件中实现如下代码:

package cn.class3g.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MenuTestActivity4 extends Activity {
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TextView tv = (TextView) this.findViewById(R.id.textView);
		this.registerForContextMenu(tv);
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		
		switch (item.getItemId()) {
		case R.id.subitem1:
			Toast.makeText(this, "subitem1", Toast.LENGTH_LONG).show();
			break;
		case R.id.subitem2:
			break;
		}

		return super.onContextItemSelected(item);
	}	
	// 每次上下文菜单显示都会调用
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		MenuInflater inflater = this.getMenuInflater();
		inflater.inflate(R.menu.sub_menu, menu);
		super.onCreateContextMenu(menu, v, menuInfo);
	}

}

 

启动Android虚拟机:

按住上边那句英文2s,弹出菜单项:

 

注意:这里一定得留意了,每创建一个Activity.java文件一定要在AndroidManifest.xml文件中注册。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值