一直在想写一片关于 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)); } }