PopupWindow

需求:点击从底部弹出一个页,可以填写姓名和电话,点击空白处(外层),弹出页消失,不遮挡键盘。

如图:

可以选择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下载地址:

http://download.csdn.net/detail/qq_24800377/9721030










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值