DialogFragUtil 打造一款DialogFragment的統一封裝類

/***
 * DialogFragUtil 打造一款DialogFragment的統一封裝類
 * 我的qq號:1457521527;歡迎互相學習~ 
 * ****歡迎star****
 *  @author yjbo
 *  @create 2017.03.29  23:00
 */

一.參考:

1.(封裝佈局內的id)封裝adapter內使用的保存layout的id方法:
http://www.cniao5.com/forum/thread/2ac69d820f0611e790dc00163e0230fa

2.(自定義DialogFragment的高度使用)https://github.com/shaohui10086/BottomDialog.git

二.源碼:

點擊下載

三.效果圖:

四.代碼分析:

主要代碼:
/** 
 * 參考:封裝adapter內使用的保存layout的id方法:http://www.cniao5.com/forum/thread/2ac69d820f0611e790dc00163e0230fa
 * @author yjbo
 * @time 2017/4/22 13:55
 */
public class ViewHolderUtil {

    private SparseArray<View> mViews;
    private View mItemView;

    public ViewHolderUtil(View itemView) {

        mItemView = itemView;
        this.mViews = new SparseArray<>();
    }

    /**
     * 從ItemView獲取View
     *
     * @param id  ItemView裏包含的ViewId
     * @param <V> 返回View
     * @return
     */
    public <V extends View> V getView(int id) {
        View view = mViews.get(id);
        if (view == null) {
            view = mItemView.findViewById(id);
            mViews.put(id, view);
        }
        return (V) view;
    }

    /**
     * 設置TextView的值
     *
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolderUtil setText(int viewId, String text) {
        TextView tv = getView(viewId);
        tv.setText(text);
        return this;
    }

    /**
     * 設置ImageView的值
     *
     * @param viewId
     * @param resId
     * @return
     */
    public ViewHolderUtil setImageResource(int viewId, int resId) {
        ImageView view = getView(viewId);
        view.setImageResource(resId);
        return this;
    }

    /**
     * 設置ImageView的值
     * 第三方  ImageLoder Glide Picasso
     * 不能直接寫死第三方圖片加載
     * 使用自己的一套規範  ImageLoder
     *
     * @param viewId
     * @return
     */
    public ViewHolderUtil setImagePath(int viewId, ImageLoder imageLoder) {
        ImageView view = getView(viewId);
        imageLoder.loadImage(view, imageLoder.getPath());
        return this;
    }

    //圖片加載 (對第三方庫加載圖片等封裝)
    public abstract static class ImageLoder {
        private String path;

        public ImageLoder(String path) {
            this.path = path;
        }

        //需要複寫該方法加載圖片
        public abstract void loadImage(ImageView imageView, String path);

        public String getPath() {
            return path;
        }
    }

    /**
     * 設置是否可見
     *
     * @param viewId
     * @param visible
     * @return
     */
    public ViewHolderUtil setVisible(int viewId, boolean visible) {
        View view = getView(viewId);
        view.setVisibility(visible ? View.VISIBLE : View.GONE);
        return this;
    }

    /**
     * 設置tag
     *
     * @param viewId
     * @param tag
     * @return
     */
    public ViewHolderUtil setTag(int viewId, Object tag) {
        View view = getView(viewId);
        view.setTag(tag);
        return this;
    }

    public ViewHolderUtil setTag(int viewId, int key, Object tag) {
        View view = getView(viewId);
        view.setTag(key, tag);
        return this;
    }

    /**
     * 設置Checkable
     *
     * @param viewId
     * @param checked
     * @return
     */
    public ViewHolderUtil setChecked(int viewId, boolean checked) {
        Checkable view = (Checkable) getView(viewId);
        view.setChecked(checked);
        return this;
    }

    //點擊事件
    public ViewHolderUtil setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

    //觸摸事件
    public ViewHolderUtil setOnTouchListener(int viewId, View.OnTouchListener listener) {
        View view = getView(viewId);
        view.setOnTouchListener(listener);
        return this;
    }

    //長按事件
    public ViewHolderUtil setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
        View view = getView(viewId);
        view.setOnLongClickListener(listener);
        return this;
    }
}
 在初始化下一個彈出框的時候把上個彈出框先去掉
        if (simpleDialogFrag != null && simpleDialogFrag.isVisible()) {
            simpleDialogFrag.dismiss();
        }
/**
 * 最簡單的DialogFragment樣式
 *
 * @author yjbo
 * @qq 1457521527
 * @time 2017/4/22 14:18
 */
public abstract class SimpleDialogFrag extends DialogFragment {

    private boolean mIsKeyCanback = true;
    private boolean mIsOutCanback = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public SimpleDialogFrag() {
    }

    /**
     * isKeyCanback 點擊物理返回鍵可以取消
     * isOutCanback 點擊除了彈出框其他地方可以取消
     *
     * @author yjbo  @time 2017/4/22 16:26
     */
    public SimpleDialogFrag(boolean isOutCanback, boolean isKeyCanback) {
        mIsKeyCanback = isKeyCanback;
        mIsOutCanback = isOutCanback;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

//        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

        getDialog().setCanceledOnTouchOutside(mIsOutCanback);//彈出框外面是否可取消

        getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
//                    getDialog().setCanceledOnTouchOutside(mIsKeyCanback);//鍵盤點擊時是否可以取消--不需要設置了
                    return !mIsKeyCanback;//return true 不往上傳遞則關閉不了,默認是可以取消,即return false
                } else {
                    return false;
                }
            }
        });
        View view = bindLayout(inflater, container);
        return view;
    }


    protected abstract View bindLayout(LayoutInflater inflater, ViewGroup container);

    //關閉彈出框
    public void hideDialog() {
        try {
            Dialog dialog = getDialog();//沒初始化就會出現問題
            if (dialog != null && dialog.isShowing()) {
                dialog.dismiss();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
/**
 * 複雜的DialogFragment樣式
 * 可以設置彈出框的寬和高
 *
 * @author yjbo
 * @qq 1457521527
 * @time 2017/4/22 14:18
 */
public abstract class ComplexDialogFrag extends DialogFragment {

    private boolean mIsKeyCanback = true;
    private boolean mIsOutCanback = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //參考 2.https://github.com/shaohui10086/BottomDialog.git;放其他地方就沒有這個效果
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.BottomDialog);

    }

    public ComplexDialogFrag() {
    }

    /**
     * isKeyCanback 點擊物理返回鍵可以取消
     * isOutCanback 點擊除了彈出框其他地方可以取消
     *
     * @author yjbo  @time 2017/4/22 16:26
     */
    public ComplexDialogFrag(boolean isOutCanback, boolean isKeyCanback) {
        mIsKeyCanback = isKeyCanback;
        mIsOutCanback = isOutCanback;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

//        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        getDialog().setCanceledOnTouchOutside(mIsOutCanback);//彈出框外面是否可取消

        getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
//                    getDialog().setCanceledOnTouchOutside(mIsKeyCanback);//鍵盤點擊時是否可以取消--不需要設置了
                    return !mIsKeyCanback;//return true 不往上傳遞則關閉不了,默認是可以取消,即return false
                } else {
                    return false;
                }
            }
        });
        View view = bindLayout(inflater, container);
        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        //獲取手機屏幕的長和寬
        WindowManager wm = (WindowManager) getContext()
                .getSystemService(Context.WINDOW_SERVICE);
        int width = wm.getDefaultDisplay().getWidth();
        int height = wm.getDefaultDisplay().getHeight();

        //這個設置寬高的必須放在onstart方法裏,不能放oncreateview裏面
        Window dialogWindow = getDialog().getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        dialogWindow.setGravity(Gravity.CENTER);// 佈局文件居中
//        dialogWindow.setLayout(lp.MATCH_PARENT, lp.WRAP_CONTENT);// 爲了讓對話框寬度鋪滿
        //alpha在0.0f到1.0f之間。1.0完全不透明,0.0f完全透明,自身不可見。
        //設置彈窗的寬度,
        lp.width = width - getResources().getDimensionPixelSize(R.dimen.dialogfrag_margin);
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//        lp.alpha=0.5f;
        dialogWindow.setAttributes(lp);
    }

    protected abstract View bindLayout(LayoutInflater inflater, ViewGroup container);

    //關閉彈出框
    public void hideDialog() {
        try {
            Dialog dialog = getDialog();//沒初始化就會出現問題
            if (dialog != null && dialog.isShowing()) {
                dialog.dismiss();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

*歡迎star*

源碼:點擊下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章