Android Popuwindow使用

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的布局文件中,把他设置成为黑色的

效果图:

由于我曾看过一篇博客,说是显示在左下角,所以这里上三张图片

Android Popuwindow使用_第1张图片Android Popuwindow使用_第2张图片Android Popuwindow使用_第3张图片

。。。不会弄图。。大家随意。看图片,看得出来,不是显示在左下角的,(设置大小为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

你可能感兴趣的:(android,Android)