PopupWindow 使用详解(一) 中文API 文档 赠送 ListPopupWindow 中文 API

笔者数了数枕巾脱落的头发,发现了 Android 开发经常使用的相似于弹窗的悬浮窗口 大概是 PopupWindow 和 dialog。以前有还算具体的写过关于 dialog 以及自定义 dialog 甚至是 dialogActivity 的相关笔记,即:Android 系统原生dialog使用Android dialog Activity 使用android自定义相对复杂dialog。忽然感受 PopupWindow 这个说简单不简单,说难不难的知识点也应该详细研究一下。
下面回归正题,请欣赏笔者的表演:git

1、建立 PopupWindow

先说一下 Google 爸爸提供的构造方法github

public PopupWindow() 

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

public PopupWindow(Context context)
public PopupWindow(Context context, AttributeSet attrs)
public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr)
public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

数一数很少很多 9 个构造方法,一个无参的 8 个有参的,参数表明的意思分别为:
View contentView表示该 PopupWindow 内装载的内容,即展现各位用户的内容
int width, int height表示该 PopupWindow 对象的长度和宽度,参数能够是 ViewGroup.LayoutParams.WRAP_CONTENTViewGroup.LayoutParams.MATCH_PARENT
也能够是具体的数值了。可是 这里规定的 是 PopupWindow 内加载到的 view 对象的大小。至关于 PopupWindow 设置的值 为 xml 内最外层布局是等效的。app

若是,须要控制加载展现的 view 大小,那么须要将该参数设置ViewGroup.LayoutParams.WRAP_CONTENT而且 目标样式外再包裹一层布局,相似于:ide

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true">

        <ImageView
            android:id="@+id/iv_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/app_name"
            android:src="@mipmap/home" />
    </RelativeLayout>
</RelativeLayout>

boolean focusablePopupWindow 响应内部的点击事件,例如 TextView、Button 等
Context context上下文,很少讲
剩下下面的三个构造方法,不经常使用,可是会自定义 view 的大佬都知道啥意思。工具

2、经常使用设置方法

//设置动画特效 即 展现和消失动画
public void setAnimationStyle(int animationStyle)
//主要做用是为了设置 PopupWindow 显示的时候是否会与 StatusBar 重叠(若是存在的话也包括 SystemBar )
public void setAttachedInDecor(boolean enabled)
//设置  PopupWindow 的背景。该属性不设置的会,会致使 PopupWindow 出现后不会消失,即使是 点击 back 键也不起做用。这应该是 PopupWindow 较为变态的地方。
public void setBackgroundDrawable(Drawable background)
//设置 PopupWindow 容许超出窗口
public void setClippingEnabled(boolean enabled)
//设置 PopupWindow  内展现的内容
public void setContentView(View contentView)
//设置 PopupWindow  的高度,相似于 3D 效果的阴影
public void setElevation(float elevation)
//设置 PopupWindow的入场动画
public void setEnterTransition(Transition enterTransition) 
//有如就得有出 设置出场动画
public void setExitTransition(Transition exitTransition)
//设置 popupWindow 是否能够获取焦点
 public void setFocusable(boolean focusable)
//设置 PopupWindow的高度
 public void setHeight(int height) 
//脸颊事件  Events 都是有大小的当触摸点大于手指头大小时,则为 脸颊事件 ,蛮有意思的 你能够尝试一下。
 public void setIgnoreCheekPress()
//设置输入法的操做模式 
 public void setInputMethodMode(int mode)
//监听 PopupWindow关闭的事件
 public void setOnDismissListener(OnDismissListener onDismissListener)
//设置 点击 PopupWindow意外区域,隐藏 popupWindow  然而并无什么卵用
 public void setOutsideTouchable(boolean touchable) 
// PopupWindow触摸时的监听回调
 public void setTouchInterceptor(OnTouchListener l)
//设置 PopupWindow是否可触摸
 public void setTouchable(boolean touchable)
//设置 popwindow 的宽度
 public void setWidth(int width)
//设置 PopupWindow布局类型
  public void setWindowLayoutType(int layoutType)

设置 PopupWindow 显示位置 相对重要 拿出来写布局

//设置 PopupWindow 在某个控件的下方,某控件的左下角与 PopupWindow 的左上角对齐
public void showAsDropDown(View anchor)

//设置 PopupWindow 在某个控件的下方,某控件的左下角与 PopupWindow 的左上角对齐,能够设置偏移量 向左为副 ,向右为正;向上为负,向下为正
 public void showAsDropDown(View anchor, int xoff, int yoff) 
//设置 PopupWindow 在至关于父布局进行摆放,能够设置偏移量。
public void showAtLocation(View parent, int gravity, int x, int y)
//隐藏 PopupWindow 
public void dismiss()

3、经常使用获取方法

//获取 PopupWindow 动画样式
 public int getAnimationStyle()
//获取 PopupWindow 背景
 public Drawable getBackground() 
//获取 PopupWindow 设置的 view 返回一个view对象
 public View getContentView() 
//得到 PopupWindow 的悬浮高度
 public float getElevation() 
//获取 PopUpWindow 的入场动画
 public float getElevation() 
//获取 PopupWindow 的出场动画
public Transition getExitTransition()
//获取 PopupWindow 的高度
public int getHeight() 
//获取输入模式
public int getInputMethodMode() 
//获取 PopupWindow 是否应该与寄生(不太合理可是不知道用啥词)对象重叠
public boolean getOverlapAnchor()
//获取 Popwindow 的宽度
 public int getWidth()
//获取 PopupWindow 的布局类型
 public int getWindowLayoutType() 

//获取可让 PopupWindow 设置的最大高度
public int getMaxAvailableHeight(View anchor)
public int getMaxAvailableHeight(View anchor, int yOffset) 
//获取能够设置 PopupWindow 的最大高度,能够忽略软键盘。
public int getMaxAvailableHeight(
            View anchor, int yOffset, boolean ignoreBottomDecorations)

4、经常使用判断方法

//判断 PopupWindow 是否在超出父布局
public boolean isAboveAnchor() 
// 判断 PopupWindow 是否在父布局的 装饰上
public boolean isAttachedInDecor()
//判读 PopupWindow 是否能够超出窗口
public boolean isClippingEnabled()
//判断 PopupWindow 是否能够获取焦点
public boolean isFocusable()
//判断 PopupWindow 是否相应自身之外的点击事件
public boolean isOutsideTouchable()
//判断 PopupWindow 是否展现
public boolean isShowing()
//判断 PopupWindow 是否支持多点触控
public boolean isSplitTouchEnabled()
//判断 PopupWindow 是否支持触摸事件
public boolean isTouchable()

5、不常使用 更新位置或更新内容方法

//更新当前 PopupWindow
public void update() 
//更新 Popwindow 到新的形态  参数:长度、宽度
public void update(int width, int height) 
//更新 Popwindow 到新的位置、新的形态  参数:新位置的坐标,长度、宽度
public void update(int x, int y, int width, int height)
//同上
public void update(int x, int y, int width, int height, boolean force)

//相对于宿主 更新体型
public void update(View anchor, int width, int height)
//相对宿主更新 大小 位置
public void update(View anchor, int xoff, int yoff, int width, int height)

6、部分主要事项

一、

PopupWindow 默认是不容许超出窗口的,具体演示请看下篇笔记;post

二、

PopupWindow 的 public void setOutsideTouchable(boolean touchable)方法默认没有什么卵用 ,是否能够点击 PopupWindow 外部进行隐藏 PopupWindow ,必须设置 public void setBackgroundDrawable(Drawable background)该方法学习

三、

getHeight()和 getWidth()方法不太好用,通常返回为 0;若是获取 PopupWindow 的长宽建议使用以下方法:动画

devPop.getContentView().measure(0, 0);
int hight=devPop.getContentView().getMeasuredHeight();
int width=devPop.getContentView().getMeasuredWidth();

四、

将 PopupWindow 的四角设置为圆角方法,能够将事先准备的 view 的父布局加一个带有圆角的 shape background, 以后设置 PopupWindow 的 setBackgroundDrawable() 方法 设置为devPop.setBackgroundDrawable(new ColorDrawable(0x00ffffff));

五、

必定要在显示 PopupWindow 的界面的 OnDestroy()方法内调用 dismiss()方法,不然会产生 “意想不到”的惊喜。

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (popupWindow != null) {
            popupWindow.dismiss();
        }
    }

六、

笔者遇到的注意事项,感受目前就这么多了,以后若是遇到还会补充;

7、附赠 ListPopupWindow 相关汉语 API

一、效果展现

或许各位不少人都知道 PopupWindow 可是 少有人知道 ListPopupWindow ,故 展现效果以下,具体应用 请留意以后的 笔记。

ListPopupWindow 效果

二、相关 API

继承结构

 

继承结构

(1)、构造方法

public ListPopupWindow( Context context)
public ListPopupWindow( Context context,  AttributeSet attrs)
public ListPopupWindow( Context context,  AttributeSet attrs,int defStyleAttr) 
public ListPopupWindow(Context context,  AttributeSet attrs,int defStyleAttr,  int defStyleRes)

构造方法就这四种,笔者经常使用的是第一种。

(2)、设置类方法

//为列表设置 适配器
public void setAdapter( ListAdapter adapter)
//设置锚点 view 寄生的view
public void setAnchorView(@Nullable View anchor)
//为 ListPopupWindow 设置动画样式
public void setAnimationStyle( int animationStyle) 
//为 ListPopupWindow 设置背景
public void setBackgroundDrawable( Drawable d)
//设置 ListPopupWindow 的宽度 单位:像素
public void setContentWidth(int width)
//设置下拉列表的对齐方式
public void setDropDownGravity(int gravity)
//设置 ListPopupWindow 的高度 单位:像素
public void setHeight(int height)
//设置横向偏移量 单位:像素
public void setHorizontalOffset(int offset)
//设置 Drawable 为列表的选择器
public void setListSelector(Drawable selector) 
//将 ListPopupWindow 设置为模态框
 public void setModal(boolean modal)
//设置 ListPopupWindow  提示位置
public void setPromptView( View prompt)
//设置 ListPopupWindow  的选定位置
public void setSelection(int position)
//设置 ListPopupWindow  输入区域的输入模式
public void setSoftInputMode(int mode)
//设置 ListPopupWindow  的竖直方向偏移量
public void setVerticalOffset(int offset)
//设置 ListPopupWindow  的宽度
public void setWidth(int width) 
//设置 ListPopupWindow  的布局类型
public void setWindowLayoutType(int layoutType)
// 可将返回对象 添加到 源视图中,进而实现拖动并打开。
public OnTouchListener createDragToOpenListener(View src)

//展现 ListPopupWindow  
public void show()

(3)、监听器

//设置 ListPopupWindow  关闭的 时的监听
public void setOnDismissListener(PopupWindow.OnDismissListener listener) 
//设置 ListPopupWindow 的 item 单击时的监听回调
public void setOnItemClickListener(AdapterView.OnItemClickListener clickListener)
//设置 ListPopupWindow  item 被选择 时的监听回调
public void setOnItemSelectedListener(OnItemSelectedListener selectedListener)

(4)、获取方法

//获取 ListPopupWindow  的锚点 view
public View getAnchorView()
//获取 ListPopupWindow  的动画样式
public  int getAnimationStyle() 
//获取 ListPopupWindow  的背景
public  Drawable getBackground() 
//获取 ListPopupWindow 的高度
public int getHeight()
//获取 ListPopupWindow 的横向偏移量
public int getHorizontalOffset() 
//获取 ListPopupWindow 的 列表
public  ListView getListView()
//获取可选的 ListPopupWindow 的位置
public int getPromptPosition()
//获取 ListPopupWindow 内被选中的 item
public  Object getSelectedItem() 
//获取被选中的 item 的 id
public long getSelectedItemId()
//获取被选中的 item 的位置
public int getSelectedItemPosition() 
//获取被选中的 view
public  View getSelectedView() 
//获取 垂直方向的偏移量  单位:像素
public int getVerticalOffset() 
//获取 ListPopupWindow 的宽度
public int getWidth()

(5)、判断方法

//判断是否为 模态框样式
public boolean isModal()
//判断是否为显示状态
public boolean isShowing()

//过了关键按键  点击事件
public boolean onKeyDown(int keyCode,  KeyEvent event)
//过滤关键按键 点击抬起事件
public boolean onKeyUp(int keyCode,  KeyEvent event)
//判断 是否 在指定 item 下执行点击事件
public boolean performItemClick(int position)

(6)、其余的重要方法

//执行相关 对 ui 线程的操做
public void postShow()
//删除 当前列表的全部选择
public void clearListSelection() 
//关闭 ListPopupWindow 
public void dismiss()

三、关于 ListPopupWindow 的其它 杂谈

当发现这个 ListPopupWindow 算是控件的工具值,笔者舍去不少地方的 ListView 和部分AutoCompleteTextView 和 Spinner 控件使用,由于 ListPopupWindow 搭配 TextView 或者搭配 EditText 极其好用。

今天学习就到这里,笔者但愿能够帮助各位在伙伴,欢迎大佬指点、批评还有建议;
以后的几篇笔者尽快写出来,只是一些 关于 ListPopupWindow 和 PopupWindow 的具体用法,相关源码会上传 github ;
不介意各位读者,帮忙点个心或者是加个关注哈 (︶.̮︶✽) !



做者:吾乃韩小呆
连接:https://www.jianshu.com/p/3a8dd7a4b41a
來源:简书
简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

转载于:https://my.oschina.net/JiangTun/blog/2998579