zoukankan      html  css  js  c++  java
  • Android仿IOS底部弹出选择菜单ActionSheet

    这里写图片描述

    使用Dialog的实现方式,解决原ActionSheet使用Fragment实现而出现的部分手机取消按钮被遮盖的问题
    java部分代码:

    import android.app.Dialog;
    import android.content.Context;
    import android.view.Display;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.view.ViewTreeObserver;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.LinearLayout;
    import android.widget.ScrollView;
    import android.widget.TextView;
    
    public class ActionSheet {
        private Dialog mDialog;
    
        public ActionSheet(Context context, View contentView, boolean cancelable, boolean otoCancelable) {
            if (context == null)
                return;
            mDialog = new Dialog(context, R.style.custom_dialog_type);
            mDialog.setContentView(contentView);
            mDialog.setCancelable(cancelable);
            mDialog.setCanceledOnTouchOutside(otoCancelable);
            Window window = mDialog.getWindow();
            WindowManager m = window.getWindowManager();
            Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
            WindowManager.LayoutParams p = window.getAttributes(); // 获取对话框当前的参数值
            p.width = d.getWidth();
            window.setAttributes(p);
            window.setGravity(Gravity.BOTTOM);  //此处可以设置dialog显示的位置
            window.setWindowAnimations(R.style.comment_popwindow_anim_style);  //添加动画
        }
    
        public void dismiss() {
            if (mDialog != null && mDialog.isShowing()) {
                mDialog.dismiss();
            }
        }
    
        public void show() {
            if (mDialog != null && !mDialog.isShowing()) {
                mDialog.show();
            }
        }
    
        public static Builder createBuilder(Context context) {
            return new Builder(context);
        }
    
        public static class Builder {
    
            private Context mContext;
            private String mCancelButtonTitle;
            private String[] mOtherButtonTitles;
            private boolean mCancelableOnTouchOutside = true;
            private ActionSheetListener mListener;
            ActionSheet ActionSheet = null;
    
            public Builder(Context context) {
                mContext = context;
            }
    
            public Builder setCancelButtonTitle(String title) {
                mCancelButtonTitle = title;
                return this;
            }
    
            public Builder setCancelButtonTitle(int strId) {
                return setCancelButtonTitle(mContext.getString(strId));
            }
    
            public Builder setOtherButtonTitles(String... titles) {
                mOtherButtonTitles = titles;
                return this;
            }
    
            public Builder setListener(ActionSheetListener listener) {
                this.mListener = listener;
                return this;
            }
    
            public Builder setCancelableOnTouchOutside(boolean cancelable) {
                mCancelableOnTouchOutside = cancelable;
                return this;
            }
    
            public ActionSheet show() {
    
                //创建View,设置监听器等
                View view = View.inflate(mContext, R.layout.dialog_actionsheet, null);
                final ScrollView scrollLayout = (ScrollView) view.findViewById(R.id.scroll_layout);
                final LinearLayout llayOther = (LinearLayout) view.findViewById(R.id.llay_other);
                //取消按钮
                TextView txtCancel = (TextView) view.findViewById(R.id.txt_cancel);
                txtCancel.setText(mCancelButtonTitle);
                txtCancel.setOnClickListener(new View.OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                        if (ActionSheet != null)
                            ActionSheet.dismiss();
                    }
                });
                //其他按钮
                if (mOtherButtonTitles != null && mOtherButtonTitles.length != 0) {
                    for (int i = 0; i < mOtherButtonTitles.length; i++) {
                        TextView textView = new TextView(mContext);
                        textView.setText(mOtherButtonTitles[i]);
    
                        textView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
                        textView.setTextColor(0xff1E82FF);
                        textView.setTextSize(16);//16sp的字体大小转化成px
                        int padding = (int) (10 * mContext.getResources().getDisplayMetrics().density + 0.5f);//10dp的padding转换成px
                        textView.setPadding(0, padding, 0, padding);
                        textView.setGravity(Gravity.CENTER);
                        textView.setBackgroundResource(getOtherButtonBg(mOtherButtonTitles, i));
    
                        final int pos = i;
                        textView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (mListener != null)
                                    mListener.onOtherButtonClick(pos);
                                if (ActionSheet != null)
                                    ActionSheet.dismiss();
                            }
                        });
                        llayOther.addView(textView);
                    }
    
    
                    /**
                     * 设置一定条数,不能再撑开,而是变成滑动
                     */
                    scrollLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                        @Override
                        public void onGlobalLayout() {
                            int minNumWhenScroll = 10;//最小可滑动条数
                            int childViewCount = llayOther.getChildCount();
                            int scrollLayoutHeight = 0;
                            int childHeight = 0;
                            if (childViewCount == 0) {
                                scrollLayoutHeight = 0;
                            } else {
                                childHeight = llayOther.getChildAt(0).getHeight();
                                if (childViewCount <= minNumWhenScroll) {
                                    scrollLayoutHeight = childHeight * childViewCount;
                                } else {
                                    scrollLayoutHeight = childHeight * minNumWhenScroll;
                                }
                            }
                            scrollLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, scrollLayoutHeight));
                            scrollLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        }
                    });
    
                }
                ActionSheet = new ActionSheet(mContext, view, mCancelableOnTouchOutside, mCancelableOnTouchOutside);
                ActionSheet.show();
    
                return ActionSheet;
            }
    
            public int getOtherButtonBg(String[] titles, int i) {
                if (titles.length == 1) {
                    return R.drawable.slt_as_ios7_other_bt_single;
                }
                if (titles.length == 2) {
                    switch (i) {
                        case 0:
                            return R.drawable.slt_as_ios7_other_bt_top;
                        case 1:
                            return R.drawable.slt_as_ios7_other_bt_bottom;
                    }
                }
                if (titles.length > 2) {
                    if (i == 0) {
                        return R.drawable.slt_as_ios7_other_bt_top;
                    }
                    if (i == (titles.length - 1)) {
                        return R.drawable.slt_as_ios7_other_bt_bottom;
                    }
                    return R.drawable.slt_as_ios7_other_bt_middle;
                }
                return 0;
            }
        }
    
        public interface ActionSheetListener {
            void onOtherButtonClick(int index);
        }
    }

    所用到的布局文件:dialog_actionsheet.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp">
    
        <ScrollView
            android:id="@+id/scroll_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/transparent"
            android:scrollbars="none">
    
            <LinearLayout
                android:id="@+id/llay_other"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/transparent"
                android:orientation="vertical">
    
            </LinearLayout>
        </ScrollView>
    
        <TextView
            android:id="@+id/txt_cancel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="@drawable/slt_as_ios7_cancel_bt"
            android:gravity="center"
            android:padding="10dp"
            android:text="取消"
            android:textColor="#1E82FF"
            android:textSize="16sp" />
    
    </LinearLayout>

    代码中使用:

    ActionSheet.createBuilder(mActivity)
                    .setCancelButtonTitle(
                            "取消")
                    .setOtherButtonTitles(
                            "保密",
                            "男",
                            "女")
                    .setCancelableOnTouchOutside(true)
                    .setListener(new ActionSheet.ActionSheetListener() {
    
                        @Override
                        public void onOtherButtonClick(int index) {
    
                            switch (index) {
                                case 0:
                                    setSex("保密");
                                    sexCode = "0";
                                    break;
                                case 1:
                                    setSex("男");
                                    sexCode = "1";
                                    break;
                                case 2:
                                    setSex("女");
                                    sexCode = "2";
                                    break;
                                default:
                                    break;
                            }
                        }
                    }).show();

    存在的部分资源文件:
    1)slt_as_ios7_other_bt_single.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:drawable="@drawable/actionsheet_single_pressed" android:state_pressed="true"/>
        <item android:drawable="@drawable/actionsheet_single_normal"/>
    
    </selector>

    2)slt_as_ios7_other_bt_top.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
        <item android:drawable="@drawable/actionsheet_top_pressed"android:state_pressed="true"/>
        <item android:drawable="@drawable/actionsheet_top_normal"/>
    </selector>

    3)slt_as_ios7_other_bt_bottom.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
        <item android:drawable="@drawable/actionsheet_bottom_pressed" android:state_pressed="true"/>
    </selector>

    4)slt_as_ios7_other_bt_middle.xml

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/actionsheet_middle_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/actionsheet_middle_normal"/>
    </selector>

    为什么使用Builder的形式:由于在项目开发中大量使用了旧版本的ActionSheet,导致更改实现时必须暴露相同的接口及实现才能减少不必要的代码修改导致的工作量,本文只给个思路

    相关资源下载
    http://download.csdn.net/detail/hai1059876295/9484915

  • 相关阅读:
    debian系统完全卸载mysql
    已解决:Linux虚拟机创建后无法切换到root
    已解决:win10 下MarkdownPad2渲染出错:This View has crashed!
    计算机网络---运输层
    计算机网络---网络层
    计算机网络---数据链路层
    计算机网络---概述
    计算机网络---物理层
    go的命令行参数---flag
    Go---第九章:使用共享变量实现并发(小知识点笔记)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/9670093.html
Copyright © 2011-2022 走看看