android的popuwindow,是window系列控件中的一种,作用是用来弹出一个他弹出框,与对话框不同,因为他是用来“提醒”的,而且是悬浮在当前activity之上的
在使用上,popuwindow与dialog迥异的是:popuwindow必须设置他的长度,宽度,才可以显示出来
public class MainActivity extends Activity { private Button button; private PopupWindow popuwindow; private View view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) this.findViewById(R.id.button); // 视图加载 view = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_popusindow, null); //设置长宽度 popuwindow = new PopupWindow(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); // 加载视图 popuwindow.setContentView(view); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //显示视图 popuwindow.showAsDropDown(button); } }); } }
这样我们就可以显示出来了,为了简单点,能看出来,我把在popuwindow的布局文件中,把他设置成为黑色的
效果图:
由于我曾看过一篇博客,说是显示在左下角,所以这里上三张图片
。。。不会弄图。。大家随意。看图片,看得出来,不是显示在左下角的,(设置大小为wrap——content)
个人觉得popupwindow一直放在那儿,好难看。怎么调节位置?
不着急。先设置他的大小。前面是使用layoutparams去设置,现在。我们可以使用popupwindow的一个构造方法:
//也可以直接设置大小
// popuwindow=new PopupWindow(view,100,100);
这样简单粗暴,然后就回到设置位置上;设置parameter?
这时候看到了这么一个函数:
public void showAsDropDown(View anchor, int xoff, int yoff) {
showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
}
没错!就是showasdropdown这个函数,可以用来设置popupwindow的位置,
什么是xoff,标准在哪儿?测试了几次,发现:
xoff,yoff基于anchor的左下角进行偏移。
而上兼顾到上面提及的两个方面。popupwindow就可以实现了,但是,此时的它却是会一直显示着
这时候要让他消失,需要调用到dismiss函数,但是直接调用,是会直接消失。顶多让手机卡顿一下,使用者却不知道popupwindow出现过
这时,调用下view里那个按钮,给他添加下点击事件
Button button1 = (Button) view.findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { popuwindow.dismiss(); } });
这时候点击下确定按钮,那么他就消失了
那么怎么让我们点击外部时候。popupwindow也能消失呢?这是有人想到了popupwindow的setoutside方法,但是很遗憾
而且查看api,没看到明显的方法(我是没看到,有看到的麻烦指点一下)
是时候百度一波了,百度过后,发现这么一句话:
所以,代码中增添了这么几句:
// 设置以下代码,即背景颜色还有外部点击事件的处理才可以点击外部消失, ColorDrawable cd = new ColorDrawable(-0000); popuwindow.setBackgroundDrawable(cd); popuwindow.setOutsideTouchable(true);
这样设置过后,我们的外部点击事件就可以执行了,到最后,大家肯定都注意到了我设置的button2.外部点击按钮,测试过后,会发现不设置outside的话,点击外部点击事件的话,button的点击事件依旧会实现。若是想让他在几秒后自动消失,很抱歉,dismiss的函数类别是void的,需要用handle去设置
最后上全部代码:
package com.example.testpopuwindow; /* * popuwindow也就两个要素,一个是需要给他设置大小 * 一个是需要给他设置内容,就是view * 需要设置背景颜色,以及onoutside才会消失 * 要在show方法中修改位置 * 在实例化的时候修改大小 */ import android.app.Activity; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.PopupWindow; import android.widget.Toast; public class MainActivity extends Activity { private Button button; private PopupWindow popuwindow; private View view; private Button button2; private Button button3; private Buttononlicklistener buttonclicklistener; private ViewGroup.LayoutParams layoutparams; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //设置layoutparams的宽 layoutparams=new ViewGroup.LayoutParams(100, 100); button2 = (Button) this.findViewById(R.id.button2); button = (Button) this.findViewById(R.id.button); // 视图加载 view = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_popusindow, null); button3 = (Button) view.findViewById(R.id.button1); // 设置长宽度 popuwindow = new PopupWindow(layoutparams.WRAP_CONTENT,layoutparams.WRAP_CONTENT); // 加载视图 popuwindow.setContentView(view); //也可以直接设置大小 // popuwindow=new PopupWindow(view,100,100); // 设置以下代码,即背景颜色还有外部点击事件的处理才可以点击外部消失, ColorDrawable cd = new ColorDrawable(-0000); popuwindow.setBackgroundDrawable(cd); popuwindow.setOutsideTouchable(true); buttonclicklistener = new Buttononlicklistener(); button.setOnClickListener(buttonclicklistener); button2.setOnClickListener(buttonclicklistener); button3.setOnClickListener(buttonclicklistener); } private class Buttononlicklistener implements OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { // 弹出popupwindow case R.id.button: //修改,设置为可以使用位置 popuwindow.showAsDropDown(button,100,0); break; // popupwindow内那个按钮 case R.id.button1: Toast.makeText(MainActivity.this, "你点击了popupwindow内部按钮", Toast.LENGTH_SHORT).show(); popuwindow.dismiss(); break; // 测试按钮(外部按钮) case R.id.button2: Toast.makeText(MainActivity.this, "外部测试按钮", Toast.LENGTH_SHORT).show(); break; } } } }