android Menu菜单 和 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);
这样就实现了窗口动画。