在基类中封装popupwindow

一直在想写一片关于 popupwindow的封装,今天 终于完成了,封装的还不够彻底 ,还可以继续封装 ,但是我这个封装是以方便自己的项目为主 ,简单的封装。

首先: 关于popupwindow 适配7.0手机 ,我从网上找资源,自定义一个SFpopupwindow 类 ,有需要可以上网搜索一下。


/**
 * Created by Administrator on 2017/9/14.
 * 适配7.0及以上的 popwindow
 */

public class SFPopupWindow extends PopupWindow {

    public SFPopupWindow(Context context) {
        super(context, null);
    }

    @Override
    public void showAsDropDown(View anchor) {
        if (Build.VERSION.SDK_INT == 24) {
            Rect rect = new Rect();
            anchor.getGlobalVisibleRect(rect);
            int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
            setHeight(h);
        }
        super.showAsDropDown(anchor);
    }
}
第二步:直接上代码 设置背景颜色 还有透明度的变化 ,直接写在基类中,此处是以 baseactivity为例子

/**
 * 弹框相关 透明度的变化
 */
class poponDismissListener implements PopupWindow.OnDismissListener {
    @Override
    public void onDismiss() {
        backgroundAlpha(1f);
    }

}

public void backgroundAlpha(float bgAlpha) {
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = bgAlpha;
    getWindow().setAttributes(lp);
}
此处是写在basefragment中的


/**
 * 弹框相关 透明度的变化
 */
class poponDismissListener implements PopupWindow.OnDismissListener {
    @Override
    public void onDismiss() {
        backgroundAlpha(1f);
    }

}

public void backgroundAlpha(float bgAlpha) {
    WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
    lp.alpha = bgAlpha;
    getActivity().getWindow().setAttributes(lp);
}

接着 :基类中的第二步 ,此处是activity的基类 在逻辑处理的方法中 加上 控件 是考虑 如果一个页面 会多次调用弹框 ,用点击的按钮来判断 ,是触发了哪个按钮的 点击事件,用于分别处理相应的逻辑事件


/**封装的popwindow 弹框
 * 1.showlocation 类型
 * 2.动画效果  从下往上
 * 3.宽度占满全屏,高度为屏幕的三分之一
 * */
public void showPopList(TextView textView) {
    if (sfPopupWindow != null && sfPopupWindow.isShowing()) {
        sfPopupWindow.dismiss();
        backgroundAlpha(1f);
    } else {
        popView = LayoutInflater.from(this).inflate(R.layout.pop_menulist_sort, null);//加载popwindow的布局
        ListView listViewSort = (ListView) popView.findViewById(R.id.menulist_sort);
        setPopListView(listViewSort,textview);//listview的配置 包含点击事件
        listViewSort.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (sfPopupWindow != null && sfPopupWindow.isShowing()) {
                    sfPopupWindow.dismiss();
                    backgroundAlpha(1f);
                }
                setPopListViewItemData(i,textview);
            }
        });
        //设置弹出popupWindow的宽高
        sfPopupWindow = new SFPopupWindow(this);
        sfPopupWindow.setContentView(popView);
        int height = getResources().getDisplayMetrics().heightPixels * 1 / 3;
        sfPopupWindow.setHeight(height);
        sfPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        sfPopupWindow.setAnimationStyle(R.style.AnimationPreview);//动画效果
        sfPopupWindow.setOnDismissListener(new poponDismissListener());
        backgroundAlpha(0.6f);
        sfPopupWindow.update();
        sfPopupWindow.setBackgroundDrawable(new BitmapDrawable());//去除黑边
        sfPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
        sfPopupWindow.setTouchable(true);
        sfPopupWindow.setOutsideTouchable(true);
        sfPopupWindow.setFocusable(true);
        sfPopupWindow.showAtLocation(textView, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
        sfPopupWindow.setTouchInterceptor(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {//点击外部消失
                    sfPopupWindow.dismiss();
                    backgroundAlpha(1f);
                    return true;
                }
                return false;
            }
        });
    }
}


/**
 * 配置下拉框中的列表
 */
public void setPopListView(ListView listView,TextView textview) {

}

/**
 * 配置下拉框中的列表 点击事件中的逻辑处理
 */
public void setPopListViewItemData(int i,TextView textview) {

}
具体思路:

将带有列表的弹框的 逻辑处理 ,封装到一个方法中,具体的实现,在具体的页面,重写方法 ,实现具体的逻辑

其中包括 点击列表 关闭 弹框 效果

接下来,看一个 具体的子类的实现 逻辑 ,我专门写了一个测试页面 ,简单的按钮点击弹出 弹框的事件

/**
 * Created by Administrator on 2017/12/8.
 * 测试封装的 下拉框
 */

public class TestBasePopActivity extends Screen {

    @BindView(R.id.relative_layout_common_back_push)
    RelativeLayout relativeLayoutCommonBackPush;
    @BindView(R.id.text_view_common_client_title_push)
    TextView textViewCommonClientTitlePush;
    @BindView(R.id.text_view_test_layout)
    TextView textViewTestLayout;
    private Context context;

    private List<String> data;//数据
    private String[] singSrc = {"像我这样优秀的人",
            "本该灿烂过一生",
            "怎么二十多年到头来",
            "还在人海里浮沉",
            "像我这样聪明的人",
            "早就告别了单纯",
            "怎么还是用了一段情",
            "去换一身伤痕",
            "像我这样迷茫的人",
            "像我这样寻找的人",
            "像我这样碌碌无为的人",
            "你还见过多少人",
            "像我这样庸俗的人",
            "从不喜欢装深沉",
            "怎么偶尔听到老歌时",
            "忽然也晃了神",
            "像我这样懦弱的人",
            "凡事都要留几分",
            "怎么曾经也会为了谁",
            "想过奋不顾身",
            "像我这样迷茫的人",
            "像我这样寻找的人",
            "像我这样碌碌无为的人",
            "你还见过多少人",
            "像我这样孤单的人",
            "像我这样傻的人",
            "像我这样不甘平凡的人",
            "世界上有多少人",
            "像我这样莫名其妙的人",
            "会不会有人心疼"};

    @Override
    protected void initView() {
        super.initView();
        setContentView(R.layout.test_activity_pop_layout);
        textViewCommonClientTitlePush.setText("测试页面");
        context = TestBasePopActivity.this;
        data = new ArrayList<>();
    }

    @Override
    protected void initData() {
        super.initData();
        setTestData();
    }

    /**
     * 测试的list的数据
     */
    public void setTestData() {

        for (int i = 0; i < singSrc.length; i++) {
            data.add(singSrc[i]);
        }
    }


    /**
     * 按钮的点击事件
     */
    @OnClick({R.id.relative_layout_common_back_push, R.id.text_view_test_layout})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.relative_layout_common_back_push:
                TestBasePopActivity.this.finish();
                break;
            case R.id.text_view_test_layout:
                showPopList(textViewTestLayout);
                break;
        }
    }

    /**
     * 设置 listview
     */
    @Override
    public void setPopListView(ListView listView) {
        super.setPopListView(listView);
        CommonAdapter<String> commonAdapterSort = new CommonAdapter<String>(context, data, R.layout.item_pop_client_enter_layout) {
            @Override
            public void setViewData(ViewHolder holder, String item, int position) {
                holder.setText(item, R.id.menuitem_sort_right);
            }
        };
        listView.setAdapter(commonAdapterSort);//设置适配器
        commonAdapterSort.notifyDataSetChanged();//刷新适配器
    }

    /**
     * 列表item点击事件同时需要做的处理逻辑
     */
    @Override
    public void setPopListViewItemData(int i) {
        super.setPopListViewItemData(i);
        App.showToast("现在点击是第" + (i + 1) + "句,歌词为:" + data.get(i));
    }
}


猜你喜欢

转载自blog.csdn.net/weixin_37166398/article/details/78752905
今日推荐