0f8eb17f2b831c89cceb6f8112ed1f107596330d.svn-base 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. package com.hjq.dialog;
  2. import android.app.Dialog;
  3. import android.content.Context;
  4. import android.support.annotation.NonNull;
  5. import android.support.v4.app.FragmentActivity;
  6. import android.support.v7.widget.GridLayoutManager;
  7. import android.support.v7.widget.RecyclerView;
  8. import android.view.Gravity;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13. import com.hjq.base.BaseDialog;
  14. import com.hjq.base.BaseDialogFragment;
  15. import com.hjq.base.BaseRecyclerViewAdapter;
  16. import com.hjq.dialog.widget.PasswordView;
  17. import java.util.Arrays;
  18. import java.util.LinkedList;
  19. /**
  20. * desc : 支付密码对话框
  21. */
  22. public final class PayPasswordDialog {
  23. public static final class Builder
  24. extends BaseDialogFragment.Builder<Builder>
  25. implements BaseRecyclerViewAdapter.OnItemClickListener,
  26. View.OnClickListener {
  27. // 输入键盘文本
  28. private static final String[] KEYBOARD_TEXT = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", ""};
  29. private OnListener mListener;
  30. private boolean mAutoDismiss = true;
  31. private PasswordView mPasswordView;
  32. private RecyclerView mRecyclerView;
  33. private LinkedList<String> mRecordList = new LinkedList<>();
  34. private TextView mTitleView;
  35. private TextView mSubTitleView;
  36. private TextView mMoneyView;
  37. private ImageView mCloseView;
  38. public Builder(FragmentActivity activity) {
  39. super(activity);
  40. setContentView(R.layout.dialog_pay_password);
  41. setAnimStyle(BaseDialog.AnimStyle.BOTTOM);
  42. setGravity(Gravity.BOTTOM);
  43. setWidth(MATCH_PARENT);
  44. mRecyclerView = findViewById(R.id.rv_dialog_pay_list);
  45. mPasswordView = findViewById(R.id.pw_dialog_pay_view);
  46. mTitleView = findViewById(R.id.tv_dialog_pay_title);
  47. mSubTitleView = findViewById(R.id.tv_dialog_pay_sub_title);
  48. mMoneyView = findViewById(R.id.tv_dialog_pay_money);
  49. mCloseView = findViewById(R.id.iv_dialog_pay_close);
  50. mCloseView.setOnClickListener(this);
  51. mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3));
  52. keyboardAdapter adapter = new keyboardAdapter(getContext());
  53. adapter.setData(Arrays.asList(KEYBOARD_TEXT));
  54. adapter.setOnItemClickListener(this);
  55. mRecyclerView.setAdapter(adapter);
  56. }
  57. public Builder setTitle(int resId) {
  58. return setTitle(getText(resId));
  59. }
  60. public Builder setTitle(CharSequence title) {
  61. if (title != null && !"".equals(title.toString())) {
  62. mTitleView.setText(title);
  63. mTitleView.setVisibility(View.VISIBLE);
  64. } else {
  65. mTitleView.setVisibility(View.GONE);
  66. }
  67. return this;
  68. }
  69. public Builder setSubTitle(int resId) {
  70. return setSubTitle(getText(resId));
  71. }
  72. public Builder setSubTitle(CharSequence subTitle) {
  73. if (subTitle != null && !"".equals(subTitle.toString())) {
  74. mSubTitleView.setText(subTitle);
  75. mSubTitleView.setVisibility(View.VISIBLE);
  76. } else {
  77. mSubTitleView.setVisibility(View.GONE);
  78. }
  79. return this;
  80. }
  81. public Builder setMoney(int resId) {
  82. return setSubTitle(getText(resId));
  83. }
  84. public Builder setMoney(CharSequence money) {
  85. if (money != null && !"".equals(money.toString())) {
  86. mMoneyView.setText(money);
  87. mMoneyView.setVisibility(View.VISIBLE);
  88. } else {
  89. mMoneyView.setVisibility(View.GONE);
  90. }
  91. return this;
  92. }
  93. public Builder setAutoDismiss(boolean dismiss) {
  94. mAutoDismiss = dismiss;
  95. return this;
  96. }
  97. public Builder setListener(OnListener l) {
  98. mListener = l;
  99. return this;
  100. }
  101. /**
  102. * {@link BaseRecyclerViewAdapter.OnItemClickListener}
  103. */
  104. @Override
  105. public void onItemClick(RecyclerView recyclerView, View itemView, int position) {
  106. switch (position) {
  107. case 0:
  108. case 1:
  109. case 2:
  110. case 3:
  111. case 4:
  112. case 5:
  113. case 6:
  114. case 7:
  115. case 8:
  116. case 10:
  117. // 判断密码是否已经输入完毕
  118. if (mRecordList.size() < PasswordView.PASSWORD_COUNT) {
  119. // 点击数字,显示在密码行
  120. mRecordList.add(KEYBOARD_TEXT[position]);
  121. }
  122. // 判断密码是否已经输入完毕
  123. if (mRecordList.size() == PasswordView.PASSWORD_COUNT) {
  124. if (mListener != null) {
  125. postDelayed(new Runnable() {
  126. @Override
  127. public void run() {
  128. if (mAutoDismiss) {
  129. dismiss();
  130. }
  131. // 获取输入的支付密码
  132. StringBuilder password = new StringBuilder();
  133. for (String s : mRecordList) {
  134. password.append(s);
  135. }
  136. mListener.onCompleted(getDialog(), password.toString());
  137. }
  138. }, 300);
  139. }
  140. }
  141. break;
  142. case 9:
  143. // 点击空白的地方不做任何操作
  144. break;
  145. case 11:
  146. // 点击回退按钮删除
  147. if (mRecordList.size() != 0) {
  148. mRecordList.removeLast();
  149. }
  150. break;
  151. default:
  152. break;
  153. }
  154. mPasswordView.setPassWordLength(mRecordList.size());
  155. }
  156. @Override
  157. public void onClick(View v) {
  158. if (v == mCloseView) {
  159. if (mAutoDismiss) {
  160. dismiss();
  161. }
  162. if (mListener != null) {
  163. mListener.onCancel(getDialog());
  164. }
  165. }
  166. }
  167. // @Override
  168. // protected BaseDialog createDialog(Context context, int themeResId) {
  169. // if (getGravity() == Gravity.BOTTOM) {
  170. // return new BaseBottomDialog(context, themeResId);
  171. // }
  172. // return super.createDialog(context, themeResId);
  173. // }
  174. }
  175. private static final class keyboardAdapter extends BaseRecyclerViewAdapter<String, keyboardAdapter.ViewHolder> {
  176. private keyboardAdapter(Context context) {
  177. super(context);
  178. }
  179. @NonNull
  180. @Override
  181. public keyboardAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  182. return new keyboardAdapter.ViewHolder(parent, R.layout.item_dialog_pay_password);
  183. }
  184. @Override
  185. public void onBindViewHolder(@NonNull keyboardAdapter.ViewHolder holder, int position) {
  186. holder.mTextView.setText(getItem(position));
  187. switch (position) {
  188. case 9:
  189. holder.mTextView.setBackgroundColor(0xFFD5D8DB);
  190. holder.mTextView.setVisibility(View.VISIBLE);
  191. holder.mImageView.setVisibility(View.GONE);
  192. holder.itemView.setBackgroundColor(0xFFECECEC);
  193. break;
  194. case 11:
  195. holder.mTextView.setBackgroundColor(0xFFD5D8DB);
  196. holder.mTextView.setVisibility(View.GONE);
  197. holder.mImageView.setVisibility(View.VISIBLE);
  198. holder.itemView.setBackgroundResource(R.drawable.dialog_pay_password_item_del_selector);
  199. break;
  200. default:
  201. break;
  202. }
  203. }
  204. final class ViewHolder extends BaseRecyclerViewAdapter.ViewHolder {
  205. private TextView mTextView;
  206. private ImageView mImageView;
  207. private ViewHolder(ViewGroup parent, int layoutId) {
  208. super(parent, layoutId);
  209. mTextView = (TextView) findViewById(R.id.tv_dialog_pay_key);
  210. mImageView = (ImageView) findViewById(R.id.iv_dialog_pay_delete);
  211. }
  212. }
  213. }
  214. public interface OnListener {
  215. /**
  216. * 输入完成时回调
  217. *
  218. * @param password 六位支付密码
  219. */
  220. void onCompleted(Dialog dialog, String password);
  221. /**
  222. * 点击取消时回调
  223. */
  224. void onCancel(Dialog dialog);
  225. }
  226. }