/***
* 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*
源碼:點擊下載