返回 登录
0

Dialog的高冷用法

阅读1785

新的一年开始了,打开朋友圈、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 implements
        android.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);
            }
        }
    }

    @Override
    public void onClick(View v) {
        this.dismiss();
    }

    @Override
    public 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

评论