• Android开发 PopupWindow开发的一些例子


    前言

      这里有一些我实际使用PopupWindow开发的一些例子,分享大家开拓思路使用。此篇博客只有代码例子,无其他入门讲解,如果你需要学习,请参考我的另一篇博客:https://www.cnblogs.com/guanxinjing/p/10156153.html

    例子1

    类似长按文本弹出的处理文本的复制,黏贴,剪切,这种迷你对话框。代码较多,我放到github上了

    github地址:https://github.com/z3880341/buttonDialog

    例子2

    效果图

    没有PopupWindow对话框时:

    PopupWindow对话框出现时:

    dialog_family_list.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent">
    
        <ImageView
            android:id="@+id/line1"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:background="@color/white"
            android:paddingLeft="20dp"
            android:src="@drawable/line_black"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>
    
        <TextView
            android:id="@+id/not_family"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_family_1"
            android:drawablePadding="13dp"
            android:gravity="center_vertical|left"
            android:paddingLeft="14dp"
            android:paddingTop="14dp"
            android:paddingBottom="14dp"
            android:text="@string/no_family_created_yet"
            android:textColor="@color/color_2C"
            android:textSize="16sp"
            android:visibility="gone"
            android:background="@color/white"
            app:layout_constraintTop_toBottomOf="@id/line1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"/>
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/family_list_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="@color/ColorWhite"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/not_family" />
    
        <ImageView
            android:id="@+id/line2"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:background="@color/white"
            android:paddingLeft="20dp"
            android:src="@drawable/line_black"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/family_list_recyclerview" />
    
        <View
            android:id="@+id/translucent_bg"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="@color/color_80000000"
            app:layout_constraintTop_toBottomOf="@id/line2"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"/>
    
        <TextView
            android:id="@+id/family_list"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_family_3"
            android:drawablePadding="13dp"
            android:gravity="center_vertical|left"
            android:paddingLeft="14dp"
            android:paddingTop="14dp"
            android:paddingBottom="14dp"
            android:text="@string/family_list"
            android:textColor="@color/color_2C"
            android:textSize="16sp"
            android:background="@drawable/bg_family_list"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/line2" />
        
    
    </androidx.constraintlayout.widget.ConstraintLayout>

    java

    public class FamilyListDialog extends PopupWindow {
        private View mView;
        private TextView mNotFamily;
        private RecyclerView mFamilyListRecyclerview;
        private TextView mFamilyList;
        private View mTranslucentBg;
        private FamilyListDialogAdapter mFamilyListDialogAdapter;
        private FamilyListDialogListener mListener;
        private int mHeightPixels;
        private List<FamilyBean> mFamilyBeanList;
    
        public FamilyListDialog(@NotNull Context context) {
            super();
            DisplayMetrics outMetrics = new DisplayMetrics();
            ((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(outMetrics);
            setWidth(outMetrics.widthPixels);
            mHeightPixels = outMetrics.heightPixels;
            setHeight(mHeightPixels);
            mView = LayoutInflater.from(context).inflate(R.layout.dialog_family_list, null, false);
            mNotFamily = (TextView) mView.findViewById(R.id.not_family);
            mFamilyListRecyclerview = (RecyclerView) mView.findViewById(R.id.family_list_recyclerview);
            mFamilyList = (TextView) mView.findViewById(R.id.family_list);
            mTranslucentBg = (View) mView.findViewById(R.id.translucent_bg);
            adaptiveRecyclerViewHeight(5, context);
            mFamilyListDialogAdapter = new FamilyListDialogAdapter();
            mFamilyListRecyclerview.setAdapter(mFamilyListDialogAdapter);
            setContentView(mView);
            initListener();
        }
    
        @Override
        public void showAsDropDown(View anchor) {
            if(Build.VERSION.SDK_INT >= 24) {
                Rect rect = new Rect();
                anchor.getGlobalVisibleRect(rect);
                DisplayMetrics outMetrics = new DisplayMetrics();
                Context context = anchor.getContext();
                ((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(outMetrics);
                int h = outMetrics.heightPixels - rect.bottom;
                setHeight(h);
            }
            super.showAsDropDown(anchor);
        }
    
        private void initListener() {
            mTranslucentBg.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dismiss();
                }
            });
            mNotFamily.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null) {
                        mListener.onClickNotFamily();
                    }
    
                }
            });
            mFamilyList.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null) {
                        mListener.onClickFamilyList(mFamilyBeanList);
                    }
    
                }
            });
            mFamilyListDialogAdapter.setOnItemClickListener(new FamilyListDialogAdapter.OnItemClickListener() {
                @Override
                public void OnItemClick(FamilyBean clickFamilyBean, boolean isConfirm) {
                    if (mListener != null) {
                        mListener.onClickFamilyListItem(clickFamilyBean, isConfirm);
                    }
                }
            });
        }
    
        public void setData(List<FamilyBean> list) {
            mFamilyBeanList = list;
            if (list == null || list.isEmpty()) {
                mFamilyListDialogAdapter.clearData();
                mFamilyListRecyclerview.setVisibility(View.GONE);
                mNotFamily.setVisibility(View.VISIBLE);
                return;
            }
            mNotFamily.setVisibility(View.GONE);
            mFamilyListRecyclerview.setVisibility(View.VISIBLE);
            mFamilyListDialogAdapter.refreshData(list);
        }
    
        /**
         * 自适应列表View在到指定数量item后固定高度,
         *
         * @param targetNum
         */
        private void adaptiveRecyclerViewHeight(int targetNum, Context context) {
            mFamilyListRecyclerview.setLayoutManager(new LinearLayoutManager(context) {
                @Override
                public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
                    int count = state.getItemCount();
                    if (count > 0) {
                        if (count > targetNum) {
                            count = targetNum;
                        }
                        int realHeight = 0;
                        int realWidth = 0;
                        for (int i = 0; i < count; i++) {
                            View view = recycler.getViewForPosition(0);
                            if (view != null) {
                                measureChild(view, widthSpec, heightSpec);
                                int measuredWidth = View.MeasureSpec.getSize(widthSpec);
                                int measuredHeight = view.getMeasuredHeight();
                                realWidth = realWidth > measuredWidth ? realWidth : measuredWidth;
                                realHeight = realHeight + measuredHeight;
                            }
                        }
                        setMeasuredDimension(realWidth, realHeight);
                    } else {
                        super.onMeasure(recycler, state, widthSpec, heightSpec);
                    }
                }
            });
        }
    
        /**
         * 销毁,主要释放接口
         */
        public void destroy() {
            mListener = null;
        }
    
        /**
         * 设置监听器
         *
         * @param mListener
         */
        public void setListener(FamilyListDialogListener mListener) {
            this.mListener = mListener;
        }
    
        public interface FamilyListDialogListener {
            /**
             * 点击没有家庭
             */
            void onClickNotFamily();
    
            /**
             * 点击家庭列表
             */
            void onClickFamilyList(List<FamilyBean> familyBeanList);
    
            /**
             * 点击列表item
             *
             * @param clickFamilyBean 被点击选择的家庭
             * @param isConfirm       是否已经加入此家庭
             */
            void onClickFamilyListItem(FamilyBean clickFamilyBean, boolean isConfirm);
    
        }
    
        /**
         * 对话框列表内部适配器类
         */
        private static class FamilyListDialogAdapter extends RecyclerView.Adapter<FamilyListDialogAdapter.ViewHolder> {
            private List<FamilyBean> mList = new ArrayList<>();
            private OnItemClickListener mOnItemClickListener;
    
            private void refreshData(List<FamilyBean> list) {
                mList.clear();
                mList.addAll(list);
                notifyDataSetChanged();
    
            }
    
            private void clearData() {
                mList.clear();
                notifyDataSetChanged();
            }
    
            @NonNull
            @Override
            public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_family_list_dialog, parent, false);
                ViewHolder viewHolder = new ViewHolder(view);
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (mOnItemClickListener != null) {
                            int position = viewHolder.getAdapterPosition();
                            if (position == RecyclerView.NO_POSITION) {
                                return;
                            }
                            boolean isConfirm = true;
                            for (FamilyBean.MembersBean membersBean : mList.get(position).getMembers()) {
                                if (membersBean.getUserId() == UserDataSP.getInstance().getUserId()) {//在成员列表里查找到当前用户id
                                    isConfirm = membersBean.isIsConfirm();
                                    break;
                                }
                            }
                            mOnItemClickListener.OnItemClick(mList.get(position), isConfirm);
                        }
                    }
                });
                return viewHolder;
            }
    
            @Override
            public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
                FamilyBean familyItem = mList.get(position);
                holder.familyName.setText(familyItem.getName());
                for (FamilyBean.MembersBean membersBean : familyItem.getMembers()) {
                    if (membersBean.getUserId() == UserDataSP.getInstance().getUserId()) {//在成员列表里查找到当前用户id
                        if (!membersBean.isIsConfirm()) {
                            holder.status.setText(R.string.waiting_to_join);
                            return;
                        }
                    }
                }
                holder.status.setText("");
            }
    
            @Override
            public int getItemCount() {
                return mList.size();
            }
    
            public void setOnItemClickListener(OnItemClickListener listener) {
                mOnItemClickListener = listener;
    
            }
    
            private class ViewHolder extends RecyclerView.ViewHolder {
                View rootView;
                TextView familyName;
                TextView status;
    
                private ViewHolder(@NonNull View itemView) {
                    super(itemView);
                    rootView = itemView;
                    familyName = (TextView) rootView.findViewById(R.id.family_name);
                    status = (TextView) rootView.findViewById(R.id.status);
                }
            }
    
            public interface OnItemClickListener {
                /**
                 * @param clickFamilyBean 被点击选择的家庭
                 * @param isConfirm       是否已经加入此家庭
                 */
                void OnItemClick(FamilyBean clickFamilyBean, boolean isConfirm);
            }
    
        }
    }

    End

  • 相关阅读:
    二开案例.开发环境.从零开发第一个插件和数据字典
    二开案例.开发环境.调试插件代码
    C#中@的用法总结
    金蝶云社区年度资料合辑
    MySQL知识框架[博文汇总-持续更新]
    Redis基础篇(五)AOF与RDB比较和选择策略
    Redis基础篇(四)持久化:内存快照(RDB)
    单调栈技巧总结
    Redis基础篇(三)持久化:AOF日志
    Redis基础篇(二)高性能IO模型
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/12746009.html
Copyright © 2020-2023  润新知