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设置大小、位置设置:

个人觉得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方法,但是很遗憾

其实这个方法时设置popupWindow以外的区域可以相应触摸事件,比如我们重写了触摸事件去做一些别的操作

而且查看api,没看到明显的方法(我是没看到,有看到的麻烦指点一下)
是时候百度一波了,百度过后,发现这么一句话:

需要顺利让PopUpWindow dimiss(即点击PopuWindow之外的地方此或者back键PopuWindow会消失);PopUpWindow的背景不能为空。必须在popuWindow.showAsDropDown(v);或者其它的显示PopuWindow方法之前设置它的背景不为空

所以,代码中增添了这么几句:

// 设置以下代码,即背景颜色还有外部点击事件的处理才可以点击外部消失, 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; } } } }







希望大家能注意到,这个控件名字是popupwindow

更多相关文章

  1. EditText的输入限制设置
  2. Linux安装mitmproxy并监控android数据包
  3. Android(安卓)EditText控件使用
  4. Android笔记1
  5. Android中的lcd_density设置
  6. android一些属性的总结
  7. 设置EditText可点击但是不可编辑
  8. 终于搞定Eclipse下看Android的源码
  9. ListPreference之entries和entryValues

随机推荐

  1. 关于虚拟机磁盘格式互转及合并,自带工具VM
  2. 什么是Lambda表达式?有什么优点?
  3. centos 普通用户使用root的权限
  4. Python的容器有哪些?分别有什么作用?
  5. android 问题汇总系列之七
  6. 不再纠结,一文详解pandas中的map、apply、
  7. 90题细品吴恩达《机器学习》,感受被刷题支
  8. 谈谈统计学正态分布阈值原理在数据分析工
  9. 学Flask框架有什么用?为什么学习Flask?
  10. n种方式教你用python读写excel等数据文件