android Menu菜单 和 PopupWindow 程序员文章站 2022-03-12 07:51:07 android Menu菜单 PopupWindow窗口一、常用菜单1.系统菜单OptionsMenu2.上下文菜单ContextMenu3.弹出菜单二、PopupWindow一、常用菜单1.系统菜单OptionsMenu1.在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件 android Menu菜单 和 PopupWindow 一、常用菜单 1.系统菜单OptionsMenu 2.上下文菜单ContextMenu (长按实现) 3.弹出菜单(点击实现) 二、PopupWindow 1、简易PopupWindow 2、PopupWindow动画 ①、创建anim文件夹 ②、创建进入和退入动画文件 pop_in.xml pop_out.xml ③、定义动画style ④、使用到PopupWindow中 一、常用菜单 1.系统菜单OptionsMenu 右上角的三个点 1.在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!--showAsAction属性:always总是 never 从不 ifroom 能显示就显示 默认是nerver--> <item android:id="@+id/blue" android:title="蓝色" /> <item android:id="@+id/red" android:title="红色" /> <item android:id="@+id/green" android:title="绿色" /> </menu> 2.Activity重写onCreateOptionsMenu加载资源文件 3.Activity重写onOptionsItemSelected加设置事件监听 //重写onCreateOptionsMenu 加载资源文件 @Override public boolean onCreateOptionsMenu(Menu menu) { //设定布局 getMenuInflater().inflate(R.menu.optionmenu, menu); return super.onCreateOptionsMenu(menu); } //重写onOptionsItemSelected 加设置事件监听 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { //获取menu item的id int id = item.getItemId(); switch (id) { case R.id.blue: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.green: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.red: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; } return super.onOptionsItemSelected(item); } 注意:一个Activity只有一个系统菜单 2.上下文菜单ContextMenu (长按实现) 可放在相对于控件的位置 1.在res下面创建一个menu文件夹,并新建一个xml文件作为ContextMenu的布局文件,我们复用上面的menu布局 2.Activity重写onCreateConextMenu加载资源文件 3.Activity重写onConextItemSelected设置事件监听 4.为控件添加长按属性并将菜单绑定到这个控件上:registerForContextMenu(控件) private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textview); //为控件添加长按属性并将菜单绑定到这个控件上 registerForContextMenu(textView); } //上下文菜单 //onCreateConextMenu加载资源文件 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); getMenuInflater().inflate(R.menu.optionmenu,menu); } //onConextItemSelected设置事件监听 @Override public boolean onContextItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.blue: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.green: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.red: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } //系统菜单 //重写onCreateOptionsMenu 加载资源文件 @Override public boolean onCreateOptionsMenu(Menu menu) { //给布局解析器设定布局 getMenuInflater().inflate(R.menu.optionmenu, menu); return super.onCreateOptionsMenu(menu); } //重写onOptionsItemSelected 加设置事件监听 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { //获取menu item的id int id = item.getItemId(); switch (id) { case R.id.blue: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.green: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.red: Toast.makeText(this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; } return super.onOptionsItemSelected(item); } 注意:长按绑定的控件+可以为任意一个view设置上下文菜单 3.弹出菜单(点击实现) 1:在res下面创建一个menu文件夹,并新建一个xml文件作为PoupMenu的布局文件。(采用之前menu) 2:把PopupMenu相关逻辑封装到showPopupMenu()方法中, 包含PopupMenu的实例化、布局设置、显示、添加MenuItem的点击监听及响应等 3:为控件设置事件监听直接调用showPopupMenu()方法 //弹出菜单 private void showPopupMenu() { //1:创建对象 参数 上下文 将要显示目标下方的控件 PopupMenu popupMenu= new PopupMenu(this,textView); //2:记载布局 popupMenu.inflate(R.menu.optionmenu); //3:事件监听 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.blue: Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.green: Toast.makeText(MainActivity.this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; case R.id.red: Toast.makeText(MainActivity.this, "你点击了" + item.getTitle(), Toast.LENGTH_SHORT).show(); break; } return false; } }); //TODO 4:显示 popupMenu.show(); } 注意:弹出菜单,默认弹出的位置在控件view的下方 二、PopupWindow 1、简易PopupWindow 设定布局可随意 private TextView textView; private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); registerForContextMenu(textView); //控件设置点击监听 弹出窗口 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showPopupMenu(); } }); //popupwindow btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //创建对象 参数上下文 PopupWindow popupWindow = new PopupWindow(MainActivity.this); //加载布局 布局随意设定 View inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.popupwindow_layout, null); //设置三要素,缺一不可. //ContentView上下文视图(布局) 高 宽 popupWindow.setContentView(inflate); popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setWidth(600); //设置外部点击取消 popupWindow.setOutsideTouchable(true); //设置弹出的位置(控件,上下移动,左右移动) popupWindow.showAsDropDown(btn,0,0); } }); } 2、PopupWindow动画 ①、创建anim文件夹 ②、创建进入和退入动画文件 pop_in.xml pop_out.xml pop_in.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000"> <translate android:fromYDelta="-300" android:toYDelta="0" /> <alpha android:fromAlpha="0.1" android:toAlpha="1" /> </set> duration:即动画执行时长 fromXScale:横向开始比例 fromYScale:纵向开始比例 toXScale:动画结束时横向的比例 float值 1即是保持正常大小 toYScale:动画结束时纵向的比例 alpha 透明度变化 pop_out.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000"> <translate android:fromYDelta="0" android:toYDelta="300" /> <alpha android:fromAlpha="1" android:toAlpha="0.1" /> </set> ③、定义动画style 在资源文件的values的style.xml中添加如下代码 <style name="pop_window" parent="android:Animation"> <item name="android:windowEnterAnimation">@anim/pop_in</item> <item name="android:windowExitAnimation">@anim/pop_out</item> </style> android:windowEnterAnimation:为窗体进入时执行 android:windowExitAnimation:为窗体退出时执行 ④、使用到PopupWindow中 //绑定动画 popupWindow.setAnimationStyle(R.style.pop_window); //设置弹出的位置(控件,上下移动,左右移动) popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0); 这样就实现了窗口动画。 本文地址:https://blog.csdn.net/muzi9928/article/details/108540817 相关标签: 安卓开发入门 android studio 上一篇: Android ERR_UNKNOWN_URL_SCHEME 下一篇: Android第八章(运用手机多媒体) 推荐阅读 Android中使用PopupWindow 仿微信点赞和评论弹出 Android开发之菜单(menu)用法实例分析 Android侧滑菜单和轮播图之滑动冲突问题 Android中的popupwindow进入和退出的动画效果 android教程之使用popupwindow创建菜单示例 Android仿微信菜单(Menu)(使用C#和Java分别实现) Android之用PopupWindow实现弹出菜单的方法详解 Android Studio调整菜单栏和字体大小方法 Android开发实现SubMenu选项菜单和子菜单示例 Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像