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

转载于:https://www.cnblogs.com/Free-Thinker/p/9670093.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值