绝密:android PopUpWindow基本使用Android工程师

/ 厦门大学软件学院Android工程师 / 2017-05-17

android工程师,android开发初学者,android经验分享

一.概述:

PopupWindow与AlertDialog的区别

最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。


二.PopupWindow的相关函数:

构造函数:

[java] view plain copy

//方法一:  

public PopupWindow (Context context)  

//方法二:  

public PopupWindow(View contentView)  

//方法三:  

public PopupWindow(View contentView, int width, int height)  

//方法四:  

public PopupWindow(View contentView, int width, int height, boolean focusable)  

首要注意:看这里有四个构造函数,但要生成一个PopupWindow最基本的三个条件是一定要设置的:View contentView,int width, int height ;少任意一个就不可能弹出来PopupWindow!!!!

所以,如果使用方法一来构造PopupWindow,那完整的构造代码应该是这样的:

[java] view plain copy

View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popuplayout, null);  

PopupWindwo popWnd = PopupWindow (context);  

popWnd.setContentView(contentView);  

popWnd.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);  

popWnd.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);  

有关为什么一定要设置width和height的原因,我们后面会讲,这里说一下为什么样强制设置contentView;很简单的原因是因为PopupWindow没有默认布局,它不会像AlertDialog那样只setTitle,就能弹出来一个框。PopupWindow是没有默认布局的,它的布局只有通过我们自己设置才行。由于方法三中,含有了这三个必备条件,不用单独设置contentview或者width、height,所以构造方法三是用的最多的一个构造方法。

最后,方法四中的focusable变量不是必须的。


三.显示函数:

显示函数主要使用下面三个:

[java] view plain copy

//相对某个控件的位置(正左下方),无偏移  

showAsDropDown(View anchor):  

//相对某个控件的位置,有偏移;xoff表示x轴的偏移,正值表示向左,负值表示向右;yoff表示相对y轴的偏移,正值是向下,负值是向上;  

showAsDropDown(View anchor, int xoff, int yoff):  

//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移  

showAtLocation(View parent, int gravity, int x, int y):  

这里有两种显示方式:

1、显示在某个指定控件的下方

showAsDropDown(View anchor):

showAsDropDown(View anchor, int xoff, int yoff);

2、指定父视图,显示在父控件的某个位置(Gravity.TOP,Gravity.RIGHT等)

showAtLocation(View parent, int gravity, int x, int y);


四.其它函数:

[java] view plain copy

public void dismiss()  

//另外几个函数,这里不讲其意义,下篇细讲  

public void setFocusable(boolean focusable)  

public void setTouchable(boolean touchable)  

public void setOutsideTouchable(boolean touchable)  

public void setBackgroundDrawable(Drawable background)  

这几个函数里,这篇只会用到dismiss(),用于不需要的时候,将窗体隐藏掉。


五.MainActivity代码:

public class MainActivity extends Activity implements View.OnClickListener{  

  

    private PopupWindow mPopWindow;  

  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

  

        Button btn = (Button) findViewById(R.id.btn);  

        btn.setOnClickListener(new View.OnClickListener() {  

            @Override  

            public void onClick(View v) {  

                showPopupWindow();  

            }  

        });  

    }  

  

    private void showPopupWindow() {  

        //设置contentView  

        View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popuplayout, null);  

        mPopWindow = new PopupWindow(contentView,  

                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);  

        mPopWindow.setContentView(contentView);  

        //设置各个控件的点击响应  

        TextView tv1 = (TextView)contentView.findViewById(R.id.pop_computer);  

        TextView tv2 = (TextView)contentView.findViewById(R.id.pop_financial);  

        TextView tv3 = (TextView)contentView.findViewById(R.id.pop_manage);  

        tv1.setOnClickListener(this);  

        tv2.setOnClickListener(this);  

        tv3.setOnClickListener(this);  

        //显示PopupWindow  

        View rootview = LayoutInflater.from(MainActivity.this).inflate(R.layout.main, null);  

        mPopWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0);  

  

    }  

  

    @Override  

    public void onClick(View v) {  

        int id = v.getId();  

        switch (id){  

            case R.id.pop_computer:{  

                Toast.makeText(this,"clicked computer",Toast.LENGTH_SHORT).show();  

                mPopWindow.dismiss();  

            }  

            break;  

            case R.id.pop_financial:{  

                Toast.makeText(this,"clicked financial",Toast.LENGTH_SHORT).show();  

                mPopWindow.dismiss();  

            }  

            break;  

            case R.id.pop_manage:{  

                Toast.makeText(this,"clicked manage",Toast.LENGTH_SHORT).show();  

                mPopWindow.dismiss();  

            }  

            break;  

        }  

    }  

}  



公众号,微信

汇鱼网海峡创乐汇
汇鱼网海峡创乐汇