防京東,支付寶密碼鍵盤(pán)和輸入框

鍵盤(pán)和輸入框分開(kāi)來(lái)寫(xiě),可以根據(jù)需求在各個(gè)地方使用,同時(shí)處理了大量邏輯,方便快速開(kāi)發(fā)。
效果圖:
keyboard.gif

一:布局代碼

  • 鍵盤(pán)由0~9的數(shù)字,刪除鍵和完成鍵組成,也可以根據(jù)需求通過(guò)GridView適配器的getItemViewType方法來(lái)定義。點(diǎn)擊鍵的時(shí)候背景有變色的效果。

  • 密碼輸入框由六個(gè)EditText組成,每個(gè)輸入框最對(duì)能輸入一個(gè)數(shù)字,監(jiān)聽(tīng)最后一個(gè)輸入框來(lái)完成密碼輸入結(jié)束的監(jiān)聽(tīng)。

二:鍵盤(pán)

  • 鍵盤(pán)中的主要邏輯處理,鍵盤(pán)樣式,item的點(diǎn)擊事件
@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return (getItemId(position) == KEY_NINE) ? 2 : 1;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = null;
    if (convertView == null) {
        if (getItemViewType(position) == 1) {
            //數(shù)字鍵
            convertView = LayoutInflater.from(context).inflate(R.layout.item_grid_keyboard, parent, false);
            viewHolder = new ViewHolder(convertView);
        } else {
            //刪除鍵
            convertView = LayoutInflater.from(context).inflate(R.layout.item_grid_keyboard_delete, parent, false);
        }
    }

    if (getItemViewType(position) == 1) {
        viewHolder = (ViewHolder) convertView.getTag();
        viewHolder.tvKey.setText(key[position]);
    }

    return convertView;
}

三:密碼輸入框

  • 密碼輸入框要處理的邏輯有刪除、輸入、輸入完成回調(diào)等
/**
 * 輸入密碼,根據(jù)StringBuilder中數(shù)據(jù)的多少進(jìn)行邏輯判斷
 * @param value
 */
public void add(String value) {
    if (mPassword != null && mPassword.length() < 6) {
        mPassword.append(value);//此處先添加到StringBuilder中,再在輸入框中顯示
        if (mPassword.length() == 1) {
            tvFirst.setText(value);
        } else if (mPassword.length() == 2) {
            tvSecond.setText(value);
        }else if (mPassword.length() == 3) {
            tvThird.setText(value);
        }else if (mPassword.length() == 4) {
            tvForth.setText(value);
        }else if (mPassword.length() == 5) {
            tvFifth.setText(value);
        }else if (mPassword.length() == 6) {
            tvSixth.setText(value);
        }
    }
}

/**
 * 刪除密碼,根據(jù)StringBuilder中數(shù)據(jù)的多少進(jìn)行邏輯判斷
 */
public void remove() {
    if (mPassword != null && mPassword.length() > 0) {
        if (mPassword.length() == 1) {
            tvFirst.setText("");
        } else if (mPassword.length() == 2) {
            tvSecond.setText("");
        }else if (mPassword.length() == 3) {
            tvThird.setText("");
        }else if (mPassword.length() == 4) {
            tvForth.setText("");
        }else if (mPassword.length() == 5) {
            tvFifth.setText("");
        }else if (mPassword.length() == 6) {
            tvSixth.setText("");
        }
        mPassword.deleteCharAt(mPassword.length() - 1);
    }
}
  • 獲取完整密碼
/**
 * 返回完整密碼
 * @return 
 */
public String getText() {
    return (mPassword == null) ? null : mPassword.toString();
}

四:實(shí)際應(yīng)用

  • 布局,也可以把鍵盤(pán)拆分開(kāi)來(lái),當(dāng)輸入的時(shí)候從窗口下方滑入
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <com.github.phoenix.widget.PayEditText
        android:id="@+id/PayEditText_pay"
        android:layout_width="match_parent"
        android:layout_marginTop="20dp"
        android:paddingLeft="12dp"
        android:layout_alignParentTop="true"
        android:paddingRight="12dp"
        android:layout_height="48dp"/>

    <com.github.phoenix.widget.Keyboard
        android:id="@+id/KeyboardView_pay"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>

</RelativeLayout>
  • 代碼中
//鍵
private static final String[] KEY = new String[] {
            "1", "2", "3",
            "4", "5", "6",
            "7", "8", "9",
            "<<", "0", "完成"
    };
//設(shè)置鍵盤(pán)
keyboard.setKeyboardKeys(KEY);
//鍵盤(pán)鍵的點(diǎn)擊事件
keyboard.setOnClickKeyboardListener(new Keyboard.OnClickKeyboardListener() {
    @Override
    public void onKeyClick(int position, String value) {
        if (position < 11 && position != 9) {
            payEditText.add(value);
        } else if (position == 9) {
            payEditText.remove();
        }else if (position == 11) {
            //當(dāng)點(diǎn)擊鍵盤(pán)上的完成按鈕時(shí),也可以通過(guò)payEditText.getText()獲取密碼,此時(shí)不應(yīng)該注冊(cè)O(shè)nInputFinishedListener接口
            Toast.makeText(getApplication(), "您的密碼是:" + payEditText.getText(), Toast.LENGTH_SHORT).show();
            finish();
        }
    }
});

//當(dāng)密碼輸入完成時(shí)的回調(diào)
payEditText.setOnInputFinishedListener(new PayEditText.OnInputFinishedListener() {
    @Override
    public void onInputFinished(String password) {
        Toast.makeText(getApplication(), "您的密碼是:" + password, Toast.LENGTH_SHORT).show();
  }
});

源碼:https://github.com/GitPhoenix/Keyboard

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,937評(píng)論 25 709
  • 不知不覺(jué),歲寒輸入法的更新歷史已經(jīng)可以列出這么一長(zhǎng)串來(lái)了。從中可以看出,歲寒的發(fā)展過(guò)程也是一個(gè)不斷試錯(cuò)的過(guò)程,其中...
    臨歲之寒閱讀 34,849評(píng)論 1 6
  • 溫馨提示:全文約:1000字,建議閱讀:8分鐘 —————————————————————————————————...
    王家大臉閱讀 6,848評(píng)論 0 0
  • 《好喜歡這天凈沙的暖》 天、凈、沙,三朵開(kāi)在秋天里的花。 很喜歡這簡(jiǎn)簡(jiǎn)單單的三個(gè)字,仿佛苦修經(jīng)年的小和尚,終于開(kāi)悟...
    阮小籍閱讀 388評(píng)論 2 4

友情鏈接更多精彩內(nèi)容