Builder模式在Android自定义底部对话框的实现
来源:互联网 发布:美国出口数据 编辑:程序博客网 时间:2024/05/16 07:35
一、什么事Builder模式
定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
模式的使用场景:
相同的方法,不同的执行顺序,产生不同的事件结果时;
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;
废话不多说,上代码先
1.构建对话框类
public class NewGhostDialog { private Context context; private Dialog dialog; private GridView gridView; private ArrayList<Icon> iconList = new ArrayList<>(); public NewGhostDialog(Context context) { this.context = context; WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); } /** * 创建 * @return */ public NewGhostDialog builder(){ initView(); setListener(); return this; } private void initView(){ View view = LayoutInflater.from(context).inflate(R.layout.dialog_ghost_new, null); // 获取自定义Dialog布局中的控件 gridView = (GridView) view.findViewById(R.id.ghostGV); // 定义Dialog布局和参数 dialog = new Dialog(context, R.style.GhostDialogStyle); dialog.setContentView(view); Window dialogWindow = dialog.getWindow(); dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.x = 0; lp.y = 0; lp.width = WindowManager.LayoutParams.MATCH_PARENT;// lp.height = WindowManager.LayoutParams.WRAP_CONTENT; dialogWindow.setAttributes(lp); gridView.setAdapter(new GhostAdapter()); } /** * * @param picRes 图标图片 * @param name 图标名字 * @param listener 点击监听 * @return */ public NewGhostDialog addItem(int picRes, String name, NewGhostDialog.OnGhostItemClickListener listener) { if (iconList == null) { iconList = new ArrayList<>(); } iconList.add(new Icon(picRes, name, listener)); return this; } /** * 可否按返回键取消 * @param cancel * @return */ public NewGhostDialog setCancelable(boolean cancel) { dialog.setCancelable(cancel); return this; } /** * 可否按对话框外部区域取消 * @param cancel * @return */ public NewGhostDialog setCanceledOnTouchOutside(boolean cancel) { dialog.setCanceledOnTouchOutside(cancel); return this; } /** * 显示 * @return */ public NewGhostDialog show() { dialog.show(); return this; } /** * 设置点击监听 * @return */ public NewGhostDialog setListener(){ gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //调用图标点击接口,顺便把图标位置传递过去 iconList.get(position).listener.onClick(position); dialog.dismiss(); } }); return this; } /** * 图标类 */ public class Icon{ public int iconRes; public String info; public NewGhostDialog.OnGhostItemClickListener listener; public Icon(int iconRes, String info, NewGhostDialog.OnGhostItemClickListener listener) { this.iconRes = iconRes; this.info = info; this.listener = listener; } } private class GhostAdapter extends BaseAdapter{ @Override public int getCount() { return iconList.size(); } @Override public Icon getItem(int position) { Icon icon = null; if (null != iconList) { icon = iconList.get(position); } return icon; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (null == convertView) { viewHolder = new ViewHolder(); LayoutInflater mInflater = LayoutInflater.from(context); convertView = mInflater.inflate(R.layout.item_ghost_icon, null); viewHolder.infoTV = (TextView) convertView.findViewById(R.id.infoTV); viewHolder.iconIV = (ImageView) convertView.findViewById(R.id.iconIV); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } Icon icon = getItem(position); if (null != icon) { viewHolder.iconIV.setImageResource(icon.iconRes); viewHolder.infoTV.setText(icon.info); } return convertView; } } private static class ViewHolder { TextView infoTV; ImageView iconIV; } /** * 点击事件接口 */ public interface OnGhostItemClickListener { void onClick(int position); }}
知识点:①ViewHolder的使用优化
②接口的定义与调用
item_ghost_icon
<?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:gravity="center" android:orientation="vertical" > <!-- item点击效果添加这个到上面 android:background="@drawable/item_background_selector"--> <ImageView android:id="@+id/iconIV" android:layout_width="40dip" android:layout_height="40dip" android:scaleType="fitXY" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/infoTV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:text="@string/app_name" android:textColor="#000000" android:textSize="14sp" /></LinearLayout>
dialog_ghost_new
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <GridView android:id="@+id/ghostGV" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="0px" android:layout_marginRight="0px" android:listSelector="@android:color/transparent" android:numColumns="3"/></RelativeLayout>
dialog进退场动画
<style name="GhostDialogStyle" parent="@android:style/Theme.Dialog"> <!-- 背景透明 --> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <!-- 浮于Activity之上 --> <item name="android:windowIsFloating">true</item> <!-- 边框 --> <item name="android:windowFrame">@null</item> <!-- Dialog以外的区域模糊效果 --> <item name="android:backgroundDimEnabled">true</item> <!-- 无标题 --> <item name="android:windowNoTitle">true</item> <!-- 半透明 --> <item name="android:windowIsTranslucent">true</item> <!-- Dialog进入及退出动画 --> <item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item></style><!-- GhostDialog进出动画 --><style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog"> <item name="android:windowEnterAnimation">@anim/dialog_ghost_in</item> <item name="android:windowExitAnimation">@anim/dialog_ghost_out</item></style>
上面的文件就可以做为一个控件啦,调用方式
new NewGhostDialog(NWMainActivity.this).builder() .addItem(R.mipmap.ic_launcher, "新世界", new NewGhostDialog.OnGhostItemClickListener() { @Override public void onClick(int position) { UIToast.showToastShort(NWMainActivity.this, "第一个"); } }) .addItem(R.mipmap.ic_launcher, "新地球", new NewGhostDialog.OnGhostItemClickListener() { @Override public void onClick(int position) { UIToast.showToastShort(NWMainActivity.this, "第二个"); } }) .addItem(R.mipmap.ic_launcher, "新宇宙", new NewGhostDialog.OnGhostItemClickListener() { @Override public void onClick(int position) { UIToast.showToastShort(NWMainActivity.this, "第三个"); } }) .setCanceledOnTouchOutside(true) .setCancelable(true) .show();
0 0
- Builder模式在Android自定义底部对话框的实现
- Android底部对话框的实现(BottomSheet,自定义Dialog)
- 【android学习】自定义的Builder弹出对话框
- android自定义底部弹出对话框
- Android自定义底部显示对话框
- Android详细的对话框AlertDialog.Builder使用方法和自定义样式
- Android自定义对话框的实现
- 自定义对话框的实现--Android
- Android代码的Builder模式实现
- Android实现自定义对话框
- Builder模式的实现
- Android 实现底部弹出对话框效果
- Android之dialog实现底部出现对话框
- 完全自定义Android对话框AlertDialog的实现
- android自定义实现好看的对话框
- android的自定义dialog对话框实现
- 完全自定义Android对话框AlertDialog的实现
- 自定义Dialog对话框并实现从底部弹出的动画效果
- Maven+Nexus 环境搭建(Windows)
- Jetty容器之浅显使用一
- c语言中的0UL或1UL是什么意思
- Android仿美团切换城市
- Objective-C Autorelease Pool 的实现原理
- Builder模式在Android自定义底部对话框的实现
- javax.el.PropertyNotFoundException: Property 'eyeSuggest' not readable on type org.smt.entity.Health
- When to upgrade your SAP HANA system?
- quick-3.6源码修改纪录
- 算法-查找-线性表的查找(顺序查找,二分查找,分块查找)
- Hive 处理count distinct 产生数据倾斜处理
- 阿里云SUSE Linux安装oracle11g
- 驱动开发调试-adb常用命令
- 动态库和静态库