? 這是我第一次在簡書上寫的第一篇文章,其實我關注簡書有一兩個月吧!平時我就在這里看看別人的文章,很有沖動自己也能像別人一樣滔滔不絕的寫作,可是我有自知自明根本不能達到那個高度。哈哈!而這一篇也是我今天在簡書寫的第一篇,因此我也喜歡我能寫更多的不管是技術方面還是其他方面。下面這些內容如果有任何問題歡迎提出,由于工作時間不是很長如有問題還望大神指正,進而改之。
廢話不多說先看要實現的效果圖:
所先聲明:支付寶QQ微信等平臺是直接輸入完自動進行下一步操作,而我這個是在鍵盤右下角確定按鈕進行下一步操作,而現在實現的只有輸入密碼功能,并沒有實現刷卡操作。
看設計圖思路: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.看到這個界面一般會想dialog實現,而且是全屏的。而一般dialog不是全部的需要設置(后面會提到)
2.自定義鍵盤,點擊鍵盤中的數字對應上部分輸入框中顯示密碼,刪除進行輸入框刪除,確定進行數據提交,而上部分輸入框右上角( X )可以取消dialog。點擊其他透明地方不進行任何操作。
代碼實現:
我就把核心代碼貼出來了,主要是我想把代碼全部貼出來可是我貼來排版好丑,完全變形了我自己都看不下去了我只能貼最要部分,其中輸入框密碼是一個自定義PasswordView.java,鍵盤Keyboard.java這兩個文件我就沒貼出來了,這部分我都難以接受~~~就將就看一下吧!等我哪天抽時間整理寫一個demo.
public classNewTableDialogManager {
public interface Listener {
public void confirm(String insertText);
}
//最大位數
private static final intMAX_INSERT_COUNT=6;
private static final intINVALID_VALUE= -1;
private ContextmContext;
private DialogmDialog;
Listener mListener;
Keyboard mNumberPad;
privatePasswordView[] mPasswordViews = new PasswordView[MAX_INSERT_COUNT];
private int mInsertCount=0;
private int[] mInsertKey = new int[MAX_INSERT_COUNT];
String mResultText="";
public NewTableDialogManager(Context context, Listener listener) {
this.mContext= context;
this.mListener= listener;
initView();
}
private void initView() {
//dialog初始化
mDialog = new Dialog(mContext, R.style.FullDialog);
mDialog.setCancelable(false);
mDialog.setCanceledOnTouchOutside(false);
//這里設置dialog為全屏
Window win = mDialog.getWindow();
win.getDecorView().setPadding(0,0,0,0);
WindowManager.LayoutParams lp = win.getAttributes();
lp.width= WindowManager.LayoutParams.MATCH_PARENT;
lp.height= WindowManager.LayoutParams.MATCH_PARENT;
win.setAttributes(lp);
mDialog.setContentView(R.layout.new_dialog_manager);
//綁定鍵盤
View numberView =mDialog.findViewById(R.id.keyboardView);
mNumberPad=newKeyboard(numberView, Keyboard.NumberPadType_hideKey);
mNumberPad.setKeyListener(mNumberPadListener);
//屏蔽左下角和右下角按鈕
RelativeLayout leftLayout = (RelativeLayout)mDialog.findViewById(R.id.leftLayout);
leftLayout.setClickable(false);
ImageView leftImageView = (ImageView)mDialog.findViewById(R.id.leftImageView);
leftImageView.setVisibility(View.INVISIBLE);
RelativeLayout pointViewPad = (RelativeLayout)mDialog.findViewById(R.id.pointViewPad);
pointViewPad.setClickable(false);
PointView pointView = (PointView)mDialog.findViewById(R.id.pointView);
pointView.setVisibility(View.INVISIBLE);
//密碼框
PasswordView passwordView1 = (PasswordView)mDialog.findViewById(R.id.passwordView1);
PasswordView passwordView2 = (PasswordView)mDialog.findViewById(R.id.passwordView2);
PasswordView passwordView3 = (PasswordView)mDialog.findViewById(R.id.passwordView3);
PasswordView passwordView4 = (PasswordView)mDialog.findViewById(R.id.passwordView4);
PasswordView passwordView5 = (PasswordView)mDialog.findViewById(R.id.passwordView5);
PasswordView passwordView6 = (PasswordView)mDialog.findViewById(R.id.passwordView6);
mPasswordViews[0] = passwordView1;
mPasswordViews[1] = passwordView2;
mPasswordViews[2] = passwordView3;
mPasswordViews[3] = passwordView4;
mPasswordViews[4] = passwordView5;
mPasswordViews[5] = passwordView6;
//關閉
ImageView mCloseImageView = (ImageView)mDialog.findViewById(R.id.closeImageView);
mCloseImageView.setOnClickListener(mCloseListener);
}
privateView.OnClickListener mCloseListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
//? ? ? ? ? ? clearInsert();
mDialog.dismiss();
}
};
privateKeyboard.KeyboardListener mNumberPadListener = newKeyboard.KeyboardListener() {
@Override
public void numberClicked(intnumber) {
if(mInsertCount> = MAX_INSERT_COUNT) {
return;
}
PasswordView passwordView = mPasswordViews[mInsertCount];
passwordView.setChecked(true);
mInsertKey[mInsertCount] = number;
mInsertCount++;
//提交驗證
if(mInsertCount == MAX_INSERT_COUNT) {
String inserTextView ="";
for(inti =0; i
inserTextView += mInsertKey[i];
}
mResultText = inserTextView;
}
}
@Override
public void leftClicked() {
}
@Override
public void pointClicked() {
}
@Override
public void topClicked() {
//刪除
if( mInsertCount == 0 ) {
return;
}
mInsertCount--;
mPasswordViews[mInsertCount].setChecked(false);
mInsertKey[mInsertCount] = INVALID_VALUE;
//
String insertText = mResultText;
if(TextUtils.isEmpty(insertText)) {
return;
}
intcount = insertText.length();
insertText = insertText.substring(0, count -1);
mResultText= insertText;
}
@Override
public void buttonClicked() {
//確定
checkDatas(mResultText);
}
@Override
public void emptyClicked() {
}
};
/**
* 提交服務器驗證
*
* @paraminsertText
*/
private voidcheckDatas(String insertText) {
if(TextUtils.isEmpty(insertText)) {
Toast.makeText(mContext,"請輸入6位數字", Toast.LENGTH_SHORT).show();
}
Log.e("insertText", insertText);
//TODO 請求接口
mListener.confirm(insertText);
//請求完成之后清空數據
clearInsert();
}
//關閉時調用
private voidclearInsert() {
mInsertCount = 0;
for(inti =0; i
mInsertKey[i] = INVALID_VALUE;
mPasswordViews[i].setChecked(false);
}
mResultText="";
}
public voidshow() {
if(mDialog.isShowing()) {
return;
}
mDialog.show();
}
public voidhide() {
mDialog.hide();
}
public voiddismiss() {
mDialog.dismiss();
}
}
布局文件效果圖:
代碼不就不貼出來了,真心想死,還不是屬性這個寫作的布局方式。
真心不敢貼代碼了。。我怕被打si。。。排版丑的無法直視。算了。。不敢再說多了,就這樣吧!就這樣吧!
---END------