android PopupWindow 简单应用

来源:互联网 发布:yoo桌面软件 编辑:程序博客网 时间:2024/05/22 09:42

由于项目需要,写了这篇博客,写的不好,敬请见谅。
在android开发中我们经常会用到一些弹出框的应用。
例如我们想要完成一个类似于下面这幅图的效果

这里写图片描述

废话不多说,先上代码。

package com.example.popupwindowdemo;import android.support.v7.app.ActionBarActivity;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.view.Gravity;import android.view.View;import android.view.WindowManager;import android.view.View.OnClickListener;import android.view.WindowManager.LayoutParams;import android.widget.Button;import android.widget.PopupWindow;import android.widget.PopupWindow.OnDismissListener;import android.widget.TextView;public class MainActivity extends ActionBarActivity {    private Button button;//响应按钮button    private PopupWindow popupWindow;//弹出框实例    private View view;//弹出显示的view    private TextView cancel;//弹出框的取消按钮    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button = (Button)findViewById(R.id.button);        button.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                backgroundAlpha(0.3f);                initDeletePopupWindow(v);            }        });       }    private void initDeletePopupWindow(View v) {        view = this.getLayoutInflater().inflate(R.layout.document_transfer_delete_pop, null);        popupWindow = new PopupWindow(view,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);        //popupWindow.setBackgroundDrawable(new BitmapDrawable());        //popupWindow.setFocusable(true); //使得pop能够获得焦点        //popupWindow.setTouchable(true); //使得pop内的内容可以响应        popupWindow.showAtLocation(v, Gravity.CENTER, 0, 0);    }    private void backgroundAlpha(float bgAlpha) {        WindowManager.LayoutParams lp = getWindow().getAttributes();        lp.alpha = bgAlpha;        getWindow().setAttributes(lp);    }}

这里其实还有两个xml文件,一个是主activity的xml,一个弹出框布局的xml,这里相信大家看图就能理解这两个xml文件的内容,这里就不贴代码了。

通过上面的代码,我们主要实现了,点击hello world按钮,弹出了一个弹出框,并且我们的背景变暗。其他部分代码都比较简单,都是平常大家经常做的按钮响应之类的,这里就不赘述了。这里主要对initDeletePopupWindow()进行分析,顾名思义,它是来显示弹出框的。其实仔细一看,这个函数总共就三句话(扣除掉我注释的)。这三句话总结一下就是

1.

view = this.getLayoutInflater().inflate(R.layout.document_transfer_delete_pop, null);

加载一个popupwindow的布局,popupwindow本身就是一个布局,或者通俗点说就是一个xml文件,因此使用前必须通过第一句话来加载(和listView中的item是一个道理的,所以在getView函数里我们总能看见这句话)

2.定义一个popupwindow的对象(包括这个弹出框显示些啥,弹出框的尺寸大小等等),看这个构造函数

popupWindow = new PopupWindow(view,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

第一个参数表示这个popupwindow需要加载的一个view布局,第二,三参数表示这个popupwindow的宽度和高度(这里用的是LayoutParams.WRAP_CONTENT,其实这里可以自由设定,单位为int型)

3.

popupWindow.showAtLocation(v, Gravity.CENTER, 0, 0);

第三句式负责显示popupwindow的,显示弹出框有两个主要函数。showAtLocation()和 showAsDropDown(),第一个函数显示是相对于父布局的,第二个函数显示是相对与某一个view。这里由于我将弹出框显示在整个activity的中间,因此选择使用第一个函数。具体使用方法请参考其他文章。

靠上面这三句话就实现了如图的功能,但是显示一个弹出框并非我们最终目的。比如,我们还想着能点击弹出框外部,能让弹出框消失,或者是,我们想要弹出框里的“删除”和”取消“按钮也能够得到监听和响应。还记得,我在initDeletePopupWindow()注释掉的几句话吗。这里为大家逐一解释

popupWindow.setBackgroundDrawable(new BitmapDrawable());popupWindow.setFocusable(true); //使得pop能够获得焦点

这两句话需要一起使用,作用是,点击阴影部分弹出框会消失

popupWindow.setTouchable(true); 

这句话是针对弹出框中的内容,若内容需要监听响应之类的,就必须加上这句话。

细心的读者发现代码中还有一个函数

 private void backgroundAlpha(float bgAlpha) {        WindowManager.LayoutParams lp = getWindow().getAttributes();        lp.alpha = bgAlpha;        getWindow().setAttributes(lp);    }

这个函数主要是设置阴影的,传入的float的代表设置的昏暗程度
比如 backgroundAlpha(1f)就是正常亮度
backgroundAlpha(0f)就是变得全黑
根据源码 参数范围为 0-1
代码中backgroundAlpha(0.3f)就达到了如图所示的黑暗效果

文章内容就这些,有些地方自身也不是很深入理解,只是能够使用,可能讲的有不对的地方,望路过的大神给予指点。

0 0
原创粉丝点击