CustomPopwindow

Introduction: 对 PopupWindow 常用 API 的简单封装,几行代码就搞定 PopupWindow 弹窗,使用 Builder 模式,链式调用,像使用 AlertDialog 一样
More: Author   ReportBugs   
Tags:

封装通用 PopupWindow,CustomPopWindow,使用链式的方式配置并显示

由于每次写 PopupWindow 都要写很多重复代码,因此简单的封装了一个 CustomPopWindow.封装了 PopupWindow 的一些常用 API,使用 Builder 模式,就像写 AlertDialog 一样,链式配置。

相关博客

1,通用 PopupWindow,几行代码搞定 PopupWindow 弹窗

2, 通用 PopupWindow,几行代码搞定 PopupWindow 弹窗(续)

3, 从源码剖析 PopupWindow 兼容 Android 6.0 以上版本点击外部不消失

Usage

由于 1.0.0 版本 是托管到 Jcenter 的,添加如下依赖:

Add the dependency to your build.gradle.

dependencies {
    compile 'com.example.zhouwei.library:library:1.0.0'
}

2.x 版本 代码托管到 Jitpack, 需要如下依赖:

  1. Add it in your root build.gradle :

    
    allprojects {
      epositories {
          ...
          maven {
              url 'https://jitpack.io'
    
          }
    
    }
    
  2. Add the dependency

    dependencies {
     compile 'com.github.pinguo-zhouwei:CustomPopwindow:2.1.1'
    }
    

示例效果图:

效果图

更新日志

v2.0.0:

  • 1,添加弹出 PopupWindow 同时背景变暗的配置,添加配置动画

v2.1.0:

  • 1, 兼容 Android 6.0 、Android 7.0 点击 PopupWindow 之外的区域可以控制 显示/关闭 popupWindow
  • 2, 可以获取到 PopupWindow 实例

    使用方法

更新 1:背景变暗配置示例:

   //创建并显示 popWindow
 mCustomPopWindow= new CustomPopWindow.PopupWindowBuilder(this)
                .setView(contentView)
                .enableBackgroundDark(true) //弹出 popWindow 时,背景是否变暗
                .setBgDarkAlpha(0.7f) // 控制亮度
                .create()
                .showAsDropDown(mButton5,0,20);

更新 2:显示消失动画配置:

 CustomPopWindow popWindow = new CustomPopWindow.PopupWindowBuilder(this)
                .setView(R.layout.pop_layout1)
                .setFocusable(true)
                .setOutsideTouchable(true)
                .setAnimationStyle(R.style.CustomPopWindowStyle) // 添加自定义显示和消失动画
                .create()
                .showAsDropDown(mButton1,0,10);

更新 3:点击 PopupWindow 以外区域不让关闭(默认 DisMiss):

 mPopWindow = new CustomPopWindow.PopupWindowBuilder(this)
                .setView(view)
                .enableOutsideTouchableDissmiss(false)// 设置点击 PopupWindow 之外的地方,popWindow 不关闭,如果不设置这个属性或者为 true,则关闭
                .create();

        mPopWindow.showAsDropDown(mButton7,0,10);

1,简便写法

CustomPopWindow popWindow = new CustomPopWindow.PopupWindowBuilder(this)
                .setView(R.layout.pop_layout1)//显示的布局,还可以通过设置一个 View
           //     .size(600,400) //设置显示的大小,不设置就默认包裹内容
                .setFocusable(true)//是否获取焦点,默认为 ture
                .setOutsideTouchable(true)//是否 PopupWindow 以外触摸 dissmiss
                .create()//创建 PopupWindow
                .showAsDropDown(mButton1,0,10);//显示 PopupWindow

以上就是弹出一个简单的 PopupWindow,是不是看起来很优雅和简单,还可以简单一点:

CustomPopWindow popWindow = new CustomPopWindow.PopupWindowBuilder(this)
                .setView(R.layout.pop_layout1)//显示的布局
                .create()//创建 PopupWindow
                .showAsDropDown(mButton1,0,10);//显示 PopupWindow

如果是一个简单的只展示文案的弹窗,就可以只设置一个 View,就可以了,很简单吧!!!

2,展示一个 PopupWindow 弹窗菜单(像手机 QQ,微信的顶部菜单)

View contentView = LayoutInflater.from(this).inflate(R.layout.pop_menu,null);
        //处理 popWindow 显示内容
        handleLogic(contentView);
        //创建并显示 popWindow
        mCustomPopWindow= new CustomPopWindow.PopupWindowBuilder(this)
                .setView(contentView)
                .create()
                .showAsDropDown(mButton3,0,20);

如果 PopupWindow 展示的内容需要在程序代码中设置或者响应点击事件等,可以现获取到这个 View,然后处理一些显示和点击事件逻辑,再交给 CustomPopWindow 创建显示。比如响应菜单点击事件的逻辑处理:

 /**
     * 处理弹出显示内容、点击事件等逻辑
     * @param contentView
     */
    private void handleLogic(View contentView){
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mCustomPopWindow!=null){
                    mCustomPopWindow.dissmiss();
                }
                String showContent = "";
                switch (v.getId()){
                    case R.id.menu1:
                        showContent = "点击 Item 菜单 1";
                        break;
                    case R.id.menu2:
                        showContent = "点击 Item 菜单 2";
                        break;
                    case R.id.menu3:
                        showContent = "点击 Item 菜单 3";
                        break;
                    case R.id.menu4:
                        showContent = "点击 Item 菜单 4";
                        break;
                    case R.id.menu5:
                        showContent = "点击 Item 菜单 5" ;
                        break;
                }
                Toast.makeText(MainActivity.this,showContent,Toast.LENGTH_SHORT).show();
            }
        };
        contentView.findViewById(R.id.menu1).setOnClickListener(listener);
        contentView.findViewById(R.id.menu2).setOnClickListener(listener);
        contentView.findViewById(R.id.menu3).setOnClickListener(listener);
        contentView.findViewById(R.id.menu4).setOnClickListener(listener);
        contentView.findViewById(R.id.menu5).setOnClickListener(listener);
    }
}

3,展示一个 ListView,其实跟上面是一样的,这里贴一下实例代码:

private void showPopListView(){
        View contentView = LayoutInflater.from(this).inflate(R.layout.pop_list,null);
        //处理 popWindow 显示内容
        handleListView(contentView);
        //创建并显示 popWindow
        mListPopWindow= new CustomPopWindow.PopupWindowBuilder(this)
                .setView(contentView)
                .size(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)//显示大小
                .create()
                .showAsDropDown(mButton4,0,20);
    }

    private void handleListView(View contentView){
        RecyclerView recyclerView = (RecyclerView) contentView.findViewById(R.id.recyclerView);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(manager);
        MyAdapter adapter = new MyAdapter();
        adapter.setData(mockData());
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

    }

联系方式

简书:http://www.jianshu.com/u/35167a70aa39

掘金:https://juejin.im/user/56949a9960b2e058a42be0ba

公众号:Android 技术杂货铺

QQ 技术交流群:155971357

欢迎关注我的公众号,第一时间获取我的博客更新提醒,以及更多有价值的原创 Android 干货文章、职场经验、面试技巧等等。 长按下方二维码即可关注。

gzh.jpg

License

   Copyright (C) 2017 zhouwei

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools