频道栏目
首页 > 资讯 > 其他 > 正文

一个通用DialogFragment的封装教程

18-07-13        来源:[db:作者]  
收藏   我要投稿

封装一个通用Dialog,使用DialogFragment有很多优势。

从代码的编写角度看,Dialog使用起来要更为简单 Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的处理屏幕翻转的情况)。 DialogFragment果然有一个非常好的特性(在手机配置变化,导致Activity需要重新创建时 例如旋屏,基于DialogFragment的对话框将会由FragmentManager自动重建,然而基于Dialog实现的对话框则没有这样的能力)。

这里写图片描述

直接开始干吧,注释直接写在代码里了:

BaseDialog

/**
 * Dialog通用样式
 */
public abstract class BaseDialog extends DialogFragment {

 @LayoutRes
 protected int mLayoutResId;

 private float mDimAmount = 0.5f;//背景昏暗度
 private boolean mShowBottomEnable;//是否底部显示
 private int mMargin = 0;//左右边距
 private int mAnimStyle = 0;//进入退出动画
 private boolean mOutCancel = true;//点击外部取消
 private Context mContext;
 private int mWidth;
 private int mHeight;

 @Override
 public void onAttach(Context context) {
  super.onAttach(context);
  mContext = context;
 }

 @Override
 public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setStyle(DialogFragment.STYLE_NO_TITLE, R.style.BaseDialog);
  mLayoutResId = setUpLayoutId();
 }

 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  View view = inflater.inflate(mLayoutResId, container, false);
  convertView(ViewHolder.create(view), this);
  return view;
 }

 @Override
 public void onStart() {
  super.onStart();
  initParams();
 }

 private void initParams() {
  Window window = getDialog().getWindow();
  if (window != null) {
WindowManager.LayoutParams params = window.getAttributes();
params.dimAmount = mDimAmount;

//设置dialog显示位置
if (mShowBottomEnable) {
 params.gravity = Gravity.BOTTOM;
}

//设置dialog宽度
if (mWidth == 0) {
 params.width = getScreenWidth(getContext()) - 2 * dp2px(getContext(), mMargin);
} else {
 params.width = dp2px(getContext(), mWidth);
}

//设置dialog高度
if (mHeight == 0) {
 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
} else {
 params.height = dp2px(getContext(), mHeight);
}

//设置dialog动画
if (mAnimStyle != 0) {
 window.setWindowAnimations(mAnimStyle);
}

window.setAttributes(params);
  }
  setCancelable(mOutCancel);
 }

 /**
  * 设置背景昏暗度
  *
  * @param dimAmount
  * @return
  */
 public BaseDialog setDimAmout(@FloatRange(from = 0, to = 1) float dimAmount) {
  mDimAmount = dimAmount;
  return this;
 }

 /**
  * 是否显示底部
  *
  * @param showBottom
  * @return
  */
 public BaseDialog setShowBottom(boolean showBottom) {
  mShowBottomEnable = showBottom;
  return this;
 }

 /**
  * 设置宽高
  *
  * @param width
  * @param height
  * @return
  */
 public BaseDialog setSize(int width, int height) {
  mWidth = width;
  mHeight = height;
  return this;
 }

 /**
  * 设置左右margin
  *
  * @param margin
  * @return
  */
 public BaseDialog setMargin(int margin) {
  mMargin = margin;
  return this;
 }

 /**
  * 设置进入退出动画
  *
  * @param animStyle
  * @return
  */
 public BaseDialog setAnimStyle(@StyleRes int animStyle) {
  mAnimStyle = animStyle;
  return this;
 }

 /**
  * 设置是否点击外部取消
  *
  * @param outCancel
  * @return
  */
 public BaseDialog setOutCancel(boolean outCancel) {
  mOutCancel = outCancel;
  return this;
 }

 public BaseDialog show(FragmentManager manager) {
  super.show(manager, String.valueOf(System.currentTimeMillis()));
  return this;
 }

 /**
  * 设置dialog布局
  *
  * @return
  */
 public abstract int setUpLayoutId();

 /**
  * 操作dialog布局
  *
  * @param holder
  * @param dialog
  */
 public abstract void convertView(ViewHolder holder, BaseDialog dialog);

 /**
  * 获取屏幕宽度
  *
  * @param context
  * @return
  */
 public static int getScreenWidth(Context context) {
  DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
  return displayMetrics.widthPixels;
 }

 public static int dp2px(Context context, float dipValue) {
  final float scale = context.getResources().getDisplayMetrics().density;
  return (int) (dipValue * scale + 0.5f);
 }
}

ViewHolder

public class ViewHolder {
 private SparseArray views;
 private View convertView;

 private ViewHolder(View view) {
  convertView = view;
  views = new SparseArray<>();
 }

 public static ViewHolder create(View view) {
  return new ViewHolder(view);
 }

 /**
  * 获取View
  *
  * @param viewId
  * @param 
  * @return
  */
 public  T getView(@IdRes int viewId) {
  View view = views.get(viewId);
  if (view == null) {
view = convertView.findViewById(viewId);
views.put(viewId, view);
  }
  return (T) view;
 }

 /**
  * 设置文本
  *
  * @param viewId
  * @param text
  */
 public void setText(int viewId, String text) {
  TextView textView = getView(viewId);
  textView.setText(text);
 }

 /**
  * 设置字体颜色
  *
  * @param viewId
  * @param colorId
  */
 public void setTextColor(int viewId, int colorId) {
  TextView textView = getView(viewId);
  textView.setTextColor(colorId);
 }

 /**
  * 设置背景图片
  *
  * @param viewId
  * @param resId
  */
 public void setBackgroundResource(int viewId, int resId) {
  View view = getView(viewId);
  view.setBackgroundResource(resId);
 }

 /**
  * 设置背景颜色
  *
  * @param viewId
  * @param colorId
  */
 public void setBackgroundColor(int viewId, int colorId) {
  View view = getView(viewId);
  view.setBackgroundColor(colorId);
 }

 /**
  * 设置点击事件
  *
  * @param viewId
  * @param listener
  */
 public void setOnClickListener(int viewId, View.OnClickListener listener) {
  View view = getView(viewId);
  view.setOnClickListener(listener);
 }
}

确定样式:ConfirmDialog

/**
 * 确定样式Dialog
 */
public class ConfirmDialog extends BaseDialog {

 private String type;

 public static ConfirmDialog newInstance(String type) {
  Bundle bundle = new Bundle();
  bundle.putString("type", type);
  ConfirmDialog dialog = new ConfirmDialog();
  dialog.setArguments(bundle);
  return dialog;
 }

 @Override
 public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Bundle bundle = getArguments();
  if (bundle == null) {
return;
  }
  type = bundle.getString("type");
 }

 @Override
 public int setUpLayoutId() {
  return R.layout.dialog_confirm;
 }

 @Override
 public void convertView(ViewHolder holder, final BaseDialog dialog) {
  if ("1".equals(type)) {
holder.setText(R.id.title, "提示");
holder.setText(R.id.message, "您已支付成功!");
  } else if ("2".equals(type)) {
holder.setText(R.id.title, "警告");
holder.setText(R.id.message, "您的帐号已被冻结!");
  }

  holder.setOnClickListener(R.id.cancel, new View.OnClickListener() {
@Override
public void onClick(View v) {
 dialog.dismiss();
}
  });
  holder.setOnClickListener(R.id.confirm, new View.OnClickListener() {
@Override
public void onClick(View v) {
 dialog.dismiss();
 Toast.makeText(getContext(), "确定", Toast.LENGTH_SHORT).show();
}
  });
 }
}

通用样式:CommonDialog

/**
 * 公用样式Dialog
 */
public class CommonDialog extends BaseDialog {
 private ViewConvertListener convertListener;

 public static CommonDialog newInstance() {
  CommonDialog dialog = new CommonDialog();
  return dialog;
 }

 /**
  * 设置Dialog布局
  *
  * @param layoutId
  * @return
  */
 public CommonDialog setLayoutId(@LayoutRes int layoutId) {
  this.mLayoutResId = layoutId;
  return this;
 }

 @Override
 public int setUpLayoutId() {
  return mLayoutResId;
 }

 @Override
 public void convertView(ViewHolder holder, BaseDialog dialog) {
  if (convertListener != null) {
convertListener.convertView(holder, dialog);
  }
 }

 public CommonDialog setConvertListener(ViewConvertListener convertListener) {
  this.convertListener = convertListener;
  return this;
 }
}

测试

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }

 //确定样式一
 public void showConfirmClick(View view) {
  ConfirmDialog.newInstance("1")
 .setMargin(60)
 .setOutCancel(false)
 .show(getSupportFragmentManager());
 }

 //确定样式二
 public void showConfirm2Click(View view) {
  ConfirmDialog.newInstance("2")
 .setMargin(60)
 .setOutCancel(true)
 .show(getSupportFragmentManager());
 }

 //分享样式
 public void showShareClick(View view) {
  CommonDialog.newInstance()
 .setLayoutId(R.layout.dialog_share)
 .setConvertListener(new ViewConvertListener() {
  @Override
  public void convertView(ViewHolder holder, final BaseDialog dialog) {
holder.setOnClickListener(R.id.tv_weixin_share, new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  Toast.makeText(MainActivity.this, "微信分享", Toast.LENGTH_SHORT).show();
  dialog.dismiss();
 }
});
  }
 })
 .setDimAmout(0.3f)
 .setShowBottom(true)
 .setAnimStyle(R.style.EnterExitAnimation)
 .show(getSupportFragmentManager());
 }

 //好有设置
 public void showFriendClick(View view) {
  CommonDialog.newInstance()
 .setLayoutId(R.layout.dialog_friend)
 .setConvertListener(new ViewConvertListener() {
  @Override
  public void convertView(ViewHolder holder, final BaseDialog dialog) {
  }
 })
 .setShowBottom(true)
 .setSize(0, 310)
 .show(getSupportFragmentManager());
 }

 //评论样式
 public void showCommentClick(View view) {
  CommonDialog.newInstance()
 .setLayoutId(R.layout.dialog_comment)
 .setConvertListener(new ViewConvertListener() {
  @Override
  public void convertView(ViewHolder holder, final BaseDialog dialog) {
final EditText et_input = holder.getView(R.id.edit_input);

holder.setOnClickListener(R.id.tv_commit, new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  String text = et_input.getText().toString().trim();
  text = TextUtils.isEmpty(text) ? "请输入文字" : et_input.getText().toString().trim();
  Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
  dialog.dismiss();
 }
});
  }
 })
 .setShowBottom(true)
 .show(getSupportFragmentManager());
 }
}
相关TAG标签
上一篇:PXE批量自动安装CentOS 6的实例教程
下一篇:通过windows远程桌面连接CentOS的实例教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站