添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 设置主色调 默认情况下,XPopup的主色为灰色,主色作用于Button文字,EditText边框和光标,Check文字的颜色上。 主色调只需要设置一次即可,可以放在Application中设置。
  • XPopup.setPrimaryColor(getResources().getColor(R.color.colorPrimary));
  • 设置全局的动画时长 默认情况下,弹窗的动画时长为360毫秒。你可以通过下面的方法进行修改:
  • XPopup.setAnimationDuration(200); // 传入的时长最小为0,动画的时长会影响除Drawer弹窗外的所有弹窗
  • 设置全局弹窗的半透明背景色值
  • XPopup.setShadowBgColor(xxx);
  • 设置全局弹窗的状态栏色值
  • XPopup.setNavigationBarColor(xxx);

    所有的设置如下,根据需要使用:

    new XPopup.Builder(getContext())
        .isViewMode(true) // 是否切换为View实现,默认是Dialog实现,具体区别看方法说明
        .hasShadowBg(true) // 是否有半透明的背景,默认为true
        .shadowBgColor()   //单独给弹窗设置背景阴影色,默认用全局的值
        .animationDuration() //单独给弹窗设置动画时长,默认走全局的值
        .hasBlurBg(true) // 是否有高斯模糊的背景,默认为false
        .isDestroyOnDismiss(true) //是否在消失的时候销毁资源,默认false。如果你的弹窗对象只使用一次,
                                  //非常推荐设置这个,可以杜绝内存泄漏。如果会使用多次,千万不要设置
        .atView() //弹窗依附的View,Attach,PartShadow,Bubble系列弹窗需要
        .atPoint(point)  //弹窗依附的点,Attach,PartShadow,Bubble系列弹窗需要,适用于地图场景直接传点
        .dismissOnBackPressed(true) // 按返回键是否关闭弹窗,默认为true
        .dismissOnTouchOutside(true) // 点击外部是否关闭弹窗,默认为true
        .isClickThrough(false)    //点击弹窗外部时,是否允许点击到下方界面,默认false
        .isTouchThrough(false)    //触摸弹窗外部时,是否允许触摸到下方界面,默认false
        .notDismissWhenTouchInView(view) //如果点击了传入的View则弹窗不消失,点击弹窗外部的其他地方再消失,
        .autoFocusEditText(true)    //是否让输入框自动获取焦点,默认为true
        .autoOpenSoftInput(true) //是否弹窗显示的同时打开输入法,只在包含输入框的弹窗内才有效,默认为false
        .popupAnimation(PopupAnimation.ScaleAlphaFromCenter) // 设置内置的动画
        .customAnimator(null) // 设置自定义的动画器
        .moveUpToKeyboard(false) // 软键盘弹出时,弹窗是否移动到软键盘上面,默认为true
        .popupPosition(PopupPosition.Right)//手动指定弹窗出现在目标的什么位置,对Attach和Drawer类型弹窗生效
        .hasStatusBarShadow(false) //是否有状态栏阴影,目前对Drawer弹窗和FullScreen弹窗生效
        .positionByWindowCenter(false) //默认是false,是否以屏幕中心进行定位,默认是false,
                                       //为false时根据Material范式进行定位,主要影响Attach系列弹窗
        .isLightStatusBar(true) //是否是亮色状态栏,默认false;亮色模式下,状态栏图标和文字是黑色
        .hasStatusBar(true) //是否显示状态栏,默认显示,一般不用设置设置, 当你App强制全屏时需要设置
        .hasNavigationBar(true) //是否显示导航栏,默认显示,一般不用设置,当你App修改了导航栏颜色的时候需要设置
        .keepScreenOn(false) //是否保持屏幕常亮,默认false
        .offsetX(-10) //弹窗在x方向的偏移量
        .offsetY(-10) //弹窗在y方向的偏移量
        .maxWidth(10) //设置弹窗的最大宽度,如果重写弹窗的getMaxWidth(),以重写的为准
        .maxHeight(10) //设置弹窗的最大高度,如果重写弹窗的getMaxHeight(),以重写的为准
        .popupWidth(10) //设置弹窗的宽度,受最大宽度限制,如果重写弹窗的getPopupHeight(),以重写的为准
        .popupHeight(10) //设置弹窗的高度,受最大高度限制,如果重写弹窗的getPopupHeight(),以重写的为准
        .isCenterHorizontal(true)//是否和目标水平居中,比如:默认情况下Attach弹窗依靠着目标的左边或者右边,
                                 //如果isCenterHorizontal为true,则与目标水平居中对齐
        .isRequestFocus(false)//默认为true,默认情况下弹窗会抢占焦点,目的是为了响应返回按键按下事件;如果为false,则不抢焦点
        .enableShowWhenAppBackground(true) //默认为false,是否允许弹窗在应用后台的时候也能显示。需要开启悬浮窗权限,一行代码即可实现
        .customHostLifecycle(lifecycle) //默认情况下XPopup监视Activity的生命周期,对于Fragment实现的UI,
                                    //可以传入Fragment的Lifecycle,从而实现在Fragment销毁时弹窗也自动销毁,省去了手动调用destroy()
        .enableDrag(true) //是否启用拖拽,默认为true,目前对Bottom和Drawer弹窗有用
        .isThreeDrag(true) //是否启用三阶拖拽(类似于BottomSheet),默认为false,目前对Bottom弹窗有用。如果enableDrag(false)则无效。
        .isDarkTheme(true)  //是否启用暗色主题
        .borderRadius(10)  //为弹窗设置圆角,默认是15,对内置弹窗生效
        .autoDismiss(false) // 操作完毕后是否自动关闭弹窗,默认为true;比如点击ConfirmPopup的确认按钮,默认自动关闭;如果为false,则不会关闭
        .setPopupCallback(new SimpleCallback() { //设置显示和隐藏的回调
            @Override
            public void onCreated() { 
                 // 弹窗内部onCreate执行完调用
            @Override
            public void beforeShow() {
                 super.beforeShow();
                 Log.e("tag", "beforeShow,在每次show之前都会执行,可以用来进行多次的数据更新。");
            @Override
            public void onShow() {
                // 完全显示的时候执行
            @Override
            public void onDismiss() {
                // 完全隐藏的时候执行
            //如果你自己想拦截返回按键事件,则重写这个方法,返回true即可
            @Override
            public boolean onBackPressed() {
                 ToastUtils.showShort("我拦截的返回按键,按返回键XPopup不会关闭了");
                 return true; //默认返回false
            //监听软键盘高度变化,高度为0说明软键盘关闭,反之则打开
            @Override
            public void onKeyBoardStateChanged(int height) {
                super.onKeyBoardStateChanged(height);
                Log.e("tag", "onKeyBoardStateChanged height: " + height);
            //监听弹窗拖拽,适用于能拖拽的弹窗
            @Override
            public void onDrag(BasePopupView popupView, int value, float percent) {
        .asXXX() //所有的设置项都要写在asXXX()方法调用之前

    数据和状态保存

    如果每次显示都new一个,由于每次都是新的弹窗,状态无法保存。可以选择记录下:

        CustomDrawerPopupView drawerPopupView = new CustomDrawerPopupView(getContext());
        //使用弹窗
        new XPopup.Builder(getContext())
                        .popupPosition(PopupPosition.Right)//右边
                        .hasStatusBarShadow(true) //启用状态栏阴影
                        .asCustom(drawerPopupView)
                        .show();

    在RecyclerView中长按弹出弹窗,这种场景需要watch一下itemView:

        CommonAdapter adapter = new CommonAdapter<String>(android.R.layout.simple_list_item_1, data) {
            @Override
            protected void bind(@NonNull ViewHolder holder, @NonNull String s, int position) {
                holder.setText(android.R.id.text1, "长按我试试 - " + position);
                //必须要在事件发生之前就watch,如果你写在onLongClickListener中的话,就拿不到触摸点了,触摸事件被长按消费了
                final XPopup.Builder builder = new XPopup.Builder(getContext()).watchView(holder.itemView);
                holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        builder.asAttachList(new String[]{"置顶", "编辑", "删除"}, null,0,10, new OnSelectListener() {
                            @Override
                            public void onSelect(int position, String text) {
                                ToastUtils.showShort(text);
                        }).show();
                        return true;
    

    弹窗提供了3个消失的方法,用来在不同场景使用:

    dismiss();
    dismissWith({});
    smartDismiss();
    

    我们在项目中经常会点击某个按钮然后关闭弹窗,接着去做一些事。比如:点击一个按钮,关闭弹窗,然后开启一个界面:

    dismiss();
    getContext().startActivity(new Intent(getContext(), DemoActivity.class));

    要知道弹窗的关闭是有一个动画过程的,上面的写法会出现弹窗还没有完全关闭,就立即跳页面,界面有一种顿挫感;而且在设备资源不足的时候,还可能造成丢帧。所以很多时候不推荐直接使用dismiss()方法,除非你关闭完弹窗后面没有任何逻辑执行。

    为了得到最佳体验,您可以等dismiss动画完全结束去执行一些东西,而不是立即就执行。可以这样做:

        dismissWith(new Runnable() {
            @Override
            public void run() {
                getContext().startActivity(new Intent(getContext(), DemoActivity.class));
    

    每个弹窗本身也有onShow()onDismiss()的生命周期回调,可以根据需要使用。

    还有这样一种场景:弹窗show()完之后,你的逻辑执行完毕,然后调用dismiss()。但是你的逻辑执行过快,可能导致弹窗的show动画还没有执行完就直接dismiss了,界面上的感觉并不好。这个时候推荐使用smartDismiss()方法,这个方法能保证弹窗的show动画执行完再关闭弹窗。