新的一年开始了,打开朋友圈、QQ空间、微博,一大波虐狗了,晒图的,炫富的又开始了,今天就带大家做这样一个图文小案例。先看下效果。
列表预览页

图片详情页

业务需求很简单,做一个小图预览,然后点击某个小图,进入大图查看,并且能够左右滑动查看图片。
实现思路也很简单,小图预览页面可以用GridView+ImageView,再为GridView添加onItemClickListener即可,这里没有什么好说了。大图查看也很简单,跳转一个Activity或者Fragment,把资源Id或者图片Url传递过去,再用ViewPager显示即可。但如果真的这样做的话,就和我们今天的主题半毛钱关系都没有了。我们现在重新看下需求,列表展示页没什么好说的,关键是在大图预览界面,我们可以看到,在大图查看页,我们只提供了一个功能,查看一个ImageView。使用Activity的话未免有点太大材小用了,而且还需要需要在配置文件中注册,太麻烦。使用Fragment貌似要稍微好点,但还是显得有点笨重,但相对于Activity来会好很多,但对于这样简单的需求来说,还是显得麻烦,不够轻便。我们最终的选择就是今天的主角Dialog。

    public void setContentView(int layoutResID) {mWindow.setContentView(layoutResID);}

查看Dialog的源码,我们看到一个熟悉的方法,setContentView(); 这就让问题变的简单了,现在我们只需要自定义一个Dialog,传入我们的布局文件,然后再把这个Dialog设置成全屏的模拟成一个Activity即可

package hi.xiaoyu.hi_xiaoyu_dialog.ui;import hi.xiaoyu.hi_xiaoyu_dialog.R;
import hi.xiaoyu.hi_xiaoyu_dialog.adapter.CommonPageAdapter;import java.util.ArrayList;
import java.util.List;import android.app.Dialog;
import android.content.Context;
import android.graphics.Rect;
import android.support.v4.view.ViewPager;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;public class ImgScanHelper extends Dialog implementsandroid.view.View.OnClickListener {private List<String> mListImgUrls;private Integer[] mImgIds;private Context mContext;private ViewPager mViewPager;private int mClickItem;public ImgScanHelper(Context context, Integer[] imgIds, int clickItem) {// 设置自定义样式super(context, R.style.CustomDialog_fill);this.mContext = context;this.mImgIds = imgIds;this.mClickItem = clickItem;initView();}public ImgScanHelper(Context context, List<String> imgUrlss, int clickItem) {// 设置自定义样式super(context, R.style.CustomDialog_fill);this.mContext = context;this.mListImgUrls = imgUrlss;this.mClickItem = clickItem;initView();}private void initView() {mViewPager = new ViewPager(mContext);LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);mViewPager.setLayoutParams(params);mViewPager.setBackgroundColor(0xFF000000);setContentView(mViewPager);setParams();initViewPager();}private void setParams() {LayoutParams lay = this.getWindow().getAttributes();DisplayMetrics dm = new DisplayMetrics();this.getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm);Rect rect = new Rect();View view = getWindow().getDecorView();view.getWindowVisibleDisplayFrame(rect);lay.height = dm.heightPixels - rect.top;lay.width = dm.widthPixels;}private void initViewPager() {if (mImgIds != null && mImgIds.length > 0) {List<View> listImgs = new ArrayList<View>();for (int i = 0; i < mImgIds.length; i++) {ImageView iv = new ImageView(mContext);LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);iv.setLayoutParams(params);listImgs.add(iv);iv.setOnClickListener(this);iv.setImageResource(mImgIds[i]);// 加载网络图片// BitmapHelper.getInstance(mContext).display(iv,// mListImgUrls.get(i));}if (listImgs.size() > 0) {CommonPageAdapter pageAdapter = new CommonPageAdapter(listImgs);mViewPager.setAdapter(pageAdapter);mViewPager.setCurrentItem(mClickItem);}}}@Overridepublic void onClick(View v) {this.dismiss();}@Overridepublic void dismiss() {super.dismiss();}}
  <style name="CustomDialog_fill" parent="@android:Theme.Dialog"><item name="android:windowFrame">@null</item><item name="android:windowIsFloating">true</item><item name="android:windowIsTranslucent">true</item><item name="android:windowNoTitle">true</item><item name="android:backgroundDimEnabled">false</item><item name="android:windowBackground">@color/white</item></style>

一行代码实现了大图预览

new ImgScanHelper(MainActivity.this, mImgsIds, position).show();

这里我们是将Dialog模拟成一个Activity,实现了大图查看的功能需求。其实当我们遇到一些比较简单的需求页面,或者说一个功能需要拆散成借个页面的时候,我们使用Dialog模拟Activity的方式来实现,会使得代码更加简介明了。而且复用性极高,比如上面的图片预览功能,可以轻松移植到任何地方。
总结:Dialog模拟Activity适用于一些轻量级的功能模块,比如一些帮助功能,头像查看,图片预览等等一些不需要考虑生命周期的操作,如果你需要在Activity异常销毁时,进行一些数据存储操作,还是多花点时间写一个Activity或者Fragment。相对于Activity和Fragment来说,Dialog不需要在配置文件中注册,没有Fragment那么多麻烦的生命周期,如果你的UI界面不需要考虑生命周期带来的问题,Dialog几乎可以实现和Activity一模一样的功能。如果你需要和Activity进行通信的话也很简单,因为Dialog中持有Activity的引用,你可以通过接口回调,广播通知等方式进行通信。同样你也可以抽取一个BaseDialog,进行代码的抽取,能极大的提高你的开发效率。希望你能从此爱上Dialog !o(∩_∩)o

源码地址

【干货】Dialog的高冷用法相关推荐

  1. Dialog的高冷用法

    新的一年开始了,打开朋友圈.QQ空间.微博,一大波虐狗了,晒图的,炫富的又开始了,今天就带大家做这样一个图文小案例.先看下效果. 列表预览页 图片详情页 业务需求很简单,做一个小图预览,然后点击某个小 ...

  2. java的final也并不是那么高冷

    这天,final走过来和static说:我喜欢你咱来咱俩在一起吧. 一向安静的static一下子懵了,他眼前的final一向很高冷,今天怎么.... 于是static说:让我再想想行吗(因为现在的st ...

  3. 【性能测试】如何用一条命令完全掌握linux系统性能监控(top高阶用法)

    目  录 一 引 言 二 top命令高阶用法 场景1:采样3次,采样间隔为10s: 场景2:采样2h,采样间隔为10s,性能数据保存到test.csv文件中: 一 引 言 熟悉CentOS linux ...

  4. 如何告别「伪勤奋」?高冷冷

    转载:如何告别「伪勤奋」?高冷冷_许可 我来教你如何做到真正的勤奋吧,学会这4点,告别伪勤奋. 你有很多目标,有关于上进的决心和焦虑,也或多或少做了一些努力.每天把自己搞得很累,回头却发现自己什么都没 ...

  5. 一个“断更就封号”的高冷习惯养成类App「念」

    如果将应用市场的软件按照"正能量属性"进行排行,习惯养成类App绝对是毋庸置疑的三甲选手.和电商产品催你买买买.游戏应用拽你玩玩玩相比较,优质的习惯养成类应用总是绞尽脑汁地开发出各 ...

  6. 学渣该不该学java_为什么很多学霸不愿给学渣讲题?不是因为高冷,而是学渣太难带...

    文/小玉说 从小时候开始,我们就被家长们灌输要互相帮助,不耻下问的概念,在生活上遇到琐事要跟同学.朋友互相帮助,在学习上遇到不懂的问题,要向其他同学.老师请教. 不知道从什么时候开始,有了学霸和学渣之 ...

  7. 时间序列(七): 高冷贵族: 隐马尔可夫模型

    目录 高冷贵族: 隐马尔可夫模型 引言 例子 描述模型 基本概念* 定义 基本假设 基本问题 前向,后向算法 前向算法 后向算法 举例计算 学习问题 已知观测序列及隐序列 已知观测序列 预测问题 Vi ...

  8. 拒绝“高冷”词汇!初学C#中的委托

    拒绝"高冷"词汇!初学C#中的委托 有一天,你写了好多好多带"形参"的构造函数(就是"方法",同义),而且需要向这些构造函数里传递同样的&q ...

  9. android layerlist bitmap,android shape类似的 另一个 高端用法:layer-list

    android shape类似的 另一个 高端用法:layer-list : 简介: 将多个图片或上面两种效果按照顺序层叠起来 " <?xml version="1.0&qu ...

最新文章

  1. BIOS英文报错详解;你虽会做系统,但你会看BIOS英文报错吗,仅供大家参考学习。...
  2. CSS中让一个div的高度随着另外个一个统计的div的高度变化而变化的代码
  3. JSP每隔指定的时间段自动刷新页面
  4. java form 上传文件_java通过表单进行文件上传的几种方法
  5. Taro+react开发(30)引入静态资源地址
  6. 管理者必看!深度剖析BI与数据仓库,企业能否成功转型就看它
  7. 直播平台搭建与相关资料
  8. 苹果平板买哪款最好?
  9. Mysql 数据库学习笔记02 编程
  10. Monkeyrunner脚本的录制与回放
  11. python篇第10天【While 循环语句】
  12. CSS3 经典教程系列:CSS3 线性渐变(linear-gradient)
  13. 2022年餐饮行业的10大必看趋势
  14. 没考驾照的恭喜了!上海打响第一枪!
  15. ORACLE使用DBLINK导入导出数据
  16. P1293 班级聚会洛谷c++题解
  17. 【CS231n 课程笔记】第八讲-----常见的深度学习框架,以及GPU和CPU介绍。
  18. 20200615 碎碎念
  19. 今日科技联播:微软联合创始人之一保罗·艾伦去世;锤子否认分公司解散传闻...
  20. FineCMS v5.0.5 系统实现置顶与推荐功能及排序

热门文章

  1. Spring Boot框架
  2. IOS5短信拦截怎么实现?
  3. 【苹果推】imessage群发条件文档(推送证书)开发工具Pushnotification
  4. portal服务器认证系统有哪些,portal服务器认证过程问题
  5. 如何将屏幕截图从Nintendo Switch传输到计算机
  6. 「硬见小百科」100个示波器基础知识问答
  7. 小程序获取上一页的数据修改上一个页面的数据
  8. 对于K 均值聚类的尝试
  9. 技术面常见问题(持续更新)
  10. Python绘制卫星星下点轨迹图和卫星星座图