文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android课堂笔记(八)菜单

2022-06-06 13:54

关注

一.菜单 1.创建菜单 菜单是 UI 的重要组成部分,由一组命令组成,这些命令可在设备上通过按钮、按键或手势访问 Android 为您提供以下三种类型的菜单: 选项菜单        Options Menu 上下文菜单    Context Menu 弹出菜单        Popup Menu 选项菜单是活动菜单项的集合,用户单击仿真器/设备上的 MENU 按钮时出现: 上下文菜单:用户触摸并按住已经注册以提供上下文菜单的视图时出现: 弹出菜单: 以附加到视图的垂直列表形式显示项的列表: 2.创建选项菜单 选项菜单包括某个活动的基本操作和必要导航项目 可以在 XML 菜单资源中定义菜单及其项目,然后通过代码来扩展菜单资源 可以在项目的  res/menu 文件夹中的单独 XML 文件中创建菜单资源 要创建菜单资源,应使用以下元素: :菜单资源的根节点 :用于创建菜单项 :允许对菜单项进行分类,可选项 在主活动方法中重写以下方法 : boolean onCreateOptionsMenu(Menu menu)   boolean onPrepareOptionsMenu(Menu menu)   boolean  onOptionsItemSelected(MenuItem item)   void onOptionsMenuClosed(Menu menu) 3.创建上下文菜单 在 Android 中,在用户在某个项目(该项目已为提供上下文菜单而注册)上长按时显示上下文菜单 要注册视图以提供上下文菜单,需要调用 registerForContextMenu() 方法 并向其传递需要上下文菜单的视图 要定义上下文菜单的外观和行文,需要重写您的活动的以下回调方法: onCreateContextMenu():在即将显示上下文菜单时调用 onContextItemSelected():在选中上下文菜单中的项时调用 4.创建弹出菜单 弹出菜单使用模式弹出窗口来显示菜单,它锚定到视图上 根据可用空间,弹出菜单出现在锚视图的下方或上方 它提供一个溢出样式的菜单、命令语句的第二部分和一个下拉列表,要在 XML 中定义菜单,需要: 使用其构造函数实例化弹出菜单 使用 MenuInflater 将您的菜单资源扩展到 Menu 对象 调用 PopupMenu.show() 5.实例展示
// CreateMenu-MainActivity.java
public class MainActivity extends Activity {
	RelativeLayout layout;//1:声明布局组件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        layout=(RelativeLayout)findViewById(R.id.layout1);  //2:获取布局组件
    }
     //此方法用于初始化菜单,menu:即将要显示的Menu实例,返回true显示该menu,false 则不显示;
     //(只会在第一次初始化菜单时调用) Inflate the menu; this adds items to the action bar
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	Log.i("optionMenu", "-------onCreateOptionsMenu------");    	
    	 MenuInflater inflater = getMenuInflater();//获取MenuInflater
    	 inflater.inflate(R.menu.main, menu);	//加载Menu资源
         return true;	//此方法必须返回true,否则不予显示
    }
   //在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。     //(可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等)
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		Log.i("optionMenu", "-------onPrepareOptionsMenu------");
		return super.onPrepareOptionsMenu(menu);
	}
     // 菜单项被点击时调用,也就是菜单项的监听方法。 
     //通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		Log.i("optionMenu", "-------onOptionsItemSelected------");
		switch(item.getItemId()){ //判断选中项的id
		case R.id.red:
			layout.setBackgroundColor(Color.RED);
			break;
		case R.id.green:
			layout.setBackgroundColor(Color.GREEN);
			break;
		case R.id.yellow:
			layout.setBackgroundColor(Color.YELLOW);
			break;
		}
		return super.onOptionsItemSelected(item);
	}
    //每次菜单被关闭时调用
//(菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项)
    @Override
	public void onOptionsMenuClosed(Menu menu) {
    	Log.i("optionMenu", "-------onOptionsMenuClosed------");
		super.onOptionsMenuClosed(menu);
	}}
 
//屏蔽一切因版本而导致新api中才能使用的方法报的android lint错误
@SuppressLint("NewApi") 
public class MainActivity extends Activity {
	Button b1;//1:声明组件
	Button b2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1=(Button)findViewById(R.id.button1);
        //注册上下文菜单到b1
        registerForContextMenu(b1);
        b2=(Button)findViewById(R.id.button2);
        b2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.i("menu", "---------  b2.setOnClickListener----------");
				 //第二个参数指定锚定视图
				PopupMenu pm = new PopupMenu(MainActivity.this, b2);
				//获取一个菜单填充器,用于填充菜单,调用inflate方法填充菜单
				//getMenu获取弹出菜单的菜单 
				pm.getMenuInflater().inflate(R.menu.main, pm.getMenu());
				pm.show();
				//给弹出菜单添加菜单选项点击监听器,监听菜单项的点击事件
				pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {
					@Override
					public boolean onMenuItemClick(MenuItem item) {
						Log.i("menu", "---------  pm.setOnMenuItemClickListener----------");
						switch(item.getItemId()){
						case R.id.red:
							b2.setBackgroundColor(Color.RED);
							break;
						case R.id.green:
							b2.setBackgroundColor(Color.GREEN);
							break;
						case R.id.yellow:
							b2.setBackgroundColor(Color.YELLOW);
							break;
						}
						return true; //返回true说明该方法会处理该事件,不需要继续传播事}
    //当创建上下文菜单时三个参数自动传入
    //1. ContextMenu,使用的上下文菜单对象,就是显示菜单选项的那个菜单
    //2. 注册了上下文菜单的视图,这里是那个按钮
    //3. 上下文菜单信息,关于选中项菜单的额外信息
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
		     Log.i("menu", "---------  onCreateContextMenu()----------");
			getMenuInflater().inflate(R.menu.main, menu);
	}
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		  Log.i("menu", "---------  onContextItemSelected()----------");
		switch(item.getItemId()){
		case R.id.red:
			b1.setBackgroundColor(Color.RED);
			break;
		case R.id.green:
			b1.setBackgroundColor(Color.GREEN);
			break;
		case R.id.yellow:
			b1.setBackgroundColor(Color.YELLOW);
			break;}
		return true; //返回true表示该方法会处理菜单事件,不需要继续传播该事件
	}}
6.小结 可以在 xml 菜单资源中定义菜单及其项目,然后在应用程序代码中扩展菜单资源 MenuInflator 类有助于将菜单 XML 文件初始化到菜单对象中。 此类提供 inflate(int menuRes, Menu menu) 方法,该方法用于扩展在 XML 资源中声明的菜单层次结构 要在首次创建选项菜单后更改该菜单,可以重写 onPrepareOptionsMenu() 方法 上下文菜单类似于用户在 PC 上执行右击操作时所显示的菜单 上下文菜单用于提供对特定于某个项目的操作的访问
作者:Lyrelion


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯