需求:点击从底部弹出一个页,可以填写姓名和电话,点击空白处(外层),弹出页消失,不遮挡键盘。
如图:
可以选择Dialog,可以选择PopupWindow,本文选择PopupWindow。
1:写一个按钮,监听点击事件,点击后触发PopupWindow,再次点击触发PopupWindow消失方法。
@Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: if (popupwindow != null && popupwindow.isShowing()) { popupwindow.dismiss(); return; } else { initmPopupWindowView(); popupwindow.showAsDropDown(v, 0, 5); } break; default: break; } }
2:声明全局变量,不赋值。
private PopupWindow popupwindow; private Button button; private WindowManager.LayoutParams layoutParams;
3:创建initmPopupWindowView()方法,对popupwindow进行赋值,与设置,代码中有相应注释(注意!代码顺序不要写错,否则会失效)。
public void initmPopupWindowView() { // 获取自定义布局文件pop.xml的视图 View customView = getLayoutInflater().inflate(R.layout.popview_item, null, false); // 创建PopupWindow实例,参数为customView(触发popup的控件view)、宽度、高度 popupwindow = new PopupWindow(customView, ViewGroup.LayoutParams.MATCH_PARENT, 1280); //设置键盘和popup不遮挡 popupwindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); popupwindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); //点击空白处(外层)消失 popupwindow.setBackgroundDrawable(new BitmapDrawable()); popupwindow.setFocusable(true); // 设置动画效果 [R.style.AnimationFade 是自己事先定义好的] popupwindow.setAnimationStyle(R.style.AnimationBottomFade); // 自定义view添加触摸事件 customView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (popupwindow != null && popupwindow.isShowing()) { popupwindow.dismiss(); popupwindow = null; } return false; } }); //设定在底部显示 popupwindow.showAtLocation(button,Gravity.BOTTOM, 10,10); //父窗体变灰 layoutParams = getWindow().getAttributes(); layoutParams.alpha = 0.7f; getWindow().setAttributes(layoutParams); customView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub closePopupWindow(); return false; } }); //定义视图内的功能 //在这里操作popup层的点击事件等等 }
4:创建closePopupWindow()方法。
/** * 关闭窗口 */ private void closePopupWindow() { if (popupwindow != null && popupwindow.isShowing()) { popupwindow.dismiss(); popupwindow = null; WindowManager.LayoutParams params=getWindow().getAttributes(); params.alpha=1f; getWindow().setAttributes(params); } }
5:pop.xml的视图。
就是正常布局,自己可根据需求,正常创建即可。
6:从底部弹出,从上层消失的动画,在res文件中,新建anim文件,
##从底部弹出布局in_bottomtotop.xml
<?xml version="1.0" encoding="UTF-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="500" /> <alpha android:fromAlpha="0" android:toAlpha="1.0" android:duration="300"/> </set>
##从顶部消失布局out_toptobottom.xml
<?xml version="1.0" encoding="UTF-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromYDelta="0" android:toYDelta="-100%" /> </set>
7:在styles.xml文件(在res//values下)中填写一下代码。
<style name="AnimationBottomFade"> <!--- PopupWindow底部弹出的效果 --> <item name="android:windowEnterAnimation">@anim/in_bottomtotop</item> <item name="android:windowExitAnimation">@anim/out_toptobottom</item> </style>
8:大功告成。
Demo下载地址: