Android仿IOS底部弹出选择菜单ActionSheet

Posted brave-sailor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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




以上是关于Android仿IOS底部弹出选择菜单ActionSheet的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序之----底部菜单action-sheet

android仿IOS,滑动隐藏底部ScrollView

Android基础控件——PopupWindow模仿ios底部弹窗

商城项目实战 | 1.1 Android 仿京东商城底部布局的选择效果 —— Selector 选择器的实现

Android 自定义仿IOS上拉菜单实现

Android仿微信底部菜单栏+顶部菜单栏