Builder模式在Android自定义底部对话框的实现
2015-11-10 11:55
585 查看
一、什么事Builder模式
定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
模式的使用场景:
相同的方法,不同的执行顺序,产生不同的事件结果时;
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;
废话不多说,上代码先
1.构建对话框类
知识点:①ViewHolder的使用优化
②接口的定义与调用
item_ghost_icon
dialog_ghost_new
dialog进退场动画
上面的文件就可以做为一个控件啦,调用方式
定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
模式的使用场景:
相同的方法,不同的执行顺序,产生不同的事件结果时;
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;
废话不多说,上代码先
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();
相关文章推荐
- 使用非 GUI 模式运行 JMeter 压力测试
- 关于elementary OS 64bit UEFI启动修复
- UITabBarController用法
- String,StringBuilder的区别
- easyui validatebox 验证类型
- IOS中UITableViewCell使用详解
- UISwipeGestureRecognizer 侧滑手势
- ios中UIButton选中状态切换
- 3.UiObejct API 详细介绍
- The current branch is not configured for pull No value for key branch.master.merge found in config
- debug模式下多次自动build
- Null value was assigned to a property of primitive type setter of 的原因与解决方案
- shuipf 经典记录
- require.js简要概述及require.js的使用方法
- IOS开发—segue几种模式的介绍以及几种创建方式
- Android快速SDK(1)基础工具库QuickBase
- Queue接口的实现与使用
- 安装 XHGui对 PHP 应用进行性能诊断
- activity的生命周期
- [LintCode] Longest Increasing Continuous subsequence II