码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2018-09-18 19:04:02      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:llb   滑动   sele   字体   bre   代码   []   为什么   ext.get   

技术分享图片

使用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

标签:llb   滑动   sele   字体   bre   代码   []   为什么   ext.get   

原文地址:https://www.cnblogs.com/Free-Thinker/p/9670093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!