日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android自定義view實(shí)現(xiàn)TextView方形輸入框

瀏覽:205日期:2022-09-17 17:48:30

本文實(shí)例為大家分享了Android自定義view實(shí)現(xiàn)TextView方形輸入框的具體代碼,供大家參考,具體內(nèi)容如下

先奉上最終效果圖

Android自定義view實(shí)現(xiàn)TextView方形輸入框

實(shí)現(xiàn)思路分析:

1、 使用一個(gè)LinearLayout用來填充每一個(gè)小方格,通過動態(tài)添加,實(shí)現(xiàn)出需要數(shù)量的輸入框2、 在LinearLayout上覆蓋一層大小和LinearLayout大小完全一致的EditText,用來接口輸入信息,設(shè)置EditText輸入背景和文字為透明,并設(shè)置不展示光標(biāo),3、 監(jiān)聽EditText的內(nèi)容變化,和LinearLayout的內(nèi)容綁定,實(shí)現(xiàn)每次輸入都由LinearLayout的子布局展示出來

布局文件

<?xml version='1.0' encoding='utf-8'?><RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android'xmlns:app='http://schemas.android.com/apk/res-auto'android:layout_width='wrap_content'android:layout_height='wrap_content'> <LinearLayout android:orientation='horizontal' android: android:gravity='center' android:showDividers='middle' android:layout_width='wrap_content' android:layout_height='wrap_content'/> <EditText android: android:inputType='number' android:background='@android:color/transparent' android:layout_width='wrap_content' android:layout_height='wrap_content' android:textColor='@android:color/transparent'/></RelativeLayout>

在代碼中動態(tài)創(chuàng)建LinearLayout子布局填充,并綁定監(jiān)聽

private fun initContainer() { //動態(tài)設(shè)置EditText的大小inputReal = findViewById(R.id.inputReal)rvContentList = findViewById(R.id.rvContentList)inputReal.width = (dividerDrawable?.minimumWidth ?: 0 * (verifyCodeLen - 1)) + inputBoxSize * verifyCodeLeninputReal.height = inputBoxSizeinputReal.setTextSize(TypedValue.COMPLEX_UNIT_PX, inputTextSize * 1.0F) //禁用光標(biāo)inputReal.isCursorVisible = falseinputReal.filters = arrayOf(InputFilter.LengthFilter(verifyCodeLen))inputTextView.clear() //動態(tài)添加LinearLayout之間的分割線dividerDrawable?.let { it.setBounds(0, 0, it.minimumWidth, it.minimumHeight) rvContentList.dividerDrawable = it}for (i in 0 until verifyCodeLen) { val textView = TextView(context) textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, inputTextSize * 1.0F) textView.width = inputBoxSize textView.height = inputBoxSize textView.gravity = Gravity.CENTER textView.isFocusable = false textView.textColor = inputTextColor textView.backgroundResource = itemSelector inputTextView.add(textView)}inputTextView.forEach { rvContentList.addView(it)} }

inputReal.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(p0: Editable?) {setVerifyCodeInputValue(p0.toString())if (p0.toString().length == verifyCodeLen) { onCompleteListener?.onComplete(p0.toString())} } override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { } override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { }})

private fun setVerifyCodeInputValue(inputText: String) { inputTextView.forEach {it.text = ''it.isSelected = false } inputTextView.forEachIndexed { index, textView ->if (inputText.length > index) { textView.isSelected = true textView.text = inputText[index].toString()} }}

核心代碼就到這里了,為了方便擴(kuò)展,可以在加入自定義屬性,動態(tài)設(shè)置擴(kuò)展效果,這里就不說明了,直接看代碼即可

最后放上完整源代碼:

package org.fireking.ap.custom.viewgroup.viewimport android.content.Contextimport android.content.res.TypedArrayimport android.graphics.Colorimport android.graphics.drawable.Drawableimport android.text.Editableimport android.text.InputFilterimport android.text.Spannedimport android.text.TextWatcherimport android.util.AttributeSetimport android.util.Logimport android.util.TypedValueimport android.view.Gravityimport android.view.LayoutInflaterimport android.widget.*import androidx.core.view.forEachimport androidx.recyclerview.widget.RecyclerViewimport org.fireking.ap.Rimport org.jetbrains.anko.backgroundColorimport org.jetbrains.anko.backgroundResourceimport org.jetbrains.anko.textColorclass VerifyCodeInputLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : RelativeLayout(context, attrs, defStyleAttr) { private lateinit var inputReal: EditText private lateinit var rvContentList: LinearLayout private var onCompleteListener: OnCompleteListener? = null private var verifyCodeLen = 0 private var inputTextSize: Int = 0 private var inputTextColor: Int = 0 private var inputBoxSize: Int = 0 private var verifyInputLayoutHeight = 0 private var dividerDrawable: Drawable? = null private var itemSelector: Int = R.drawable.verify_code_text_selector private var inputTextView = ArrayList<TextView>(4) constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) {LayoutInflater.from(context).inflate(R.layout.verify_code_input_layout, this, true)//設(shè)置默認(rèn)值verifyCodeLen = 4inputTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16.0F, resources.displayMetrics).toInt()inputTextColor = Color.parseColor('#FF333333')inputBoxSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50F, resources.displayMetrics).toInt()dividerDrawable = context.resources.getDrawable(R.drawable.linearlayout_divider)//獲取自定義屬性值val a = context.obtainStyledAttributes(attrs, R.styleable.VerifyCodeInputLayout)if (a.hasValue(R.styleable.VerifyCodeInputLayout_textSize)) { inputTextSize = a.getDimensionPixelSize(R.styleable.VerifyCodeInputLayout_textSize, inputTextSize)}if (a.hasValue(R.styleable.VerifyCodeInputLayout_textColor)) { inputTextColor = a.getColor(R.styleable.VerifyCodeInputLayout_textColor, Color.parseColor('#FF333333'))}if (a.hasValue(R.styleable.VerifyCodeInputLayout_inputBoxSize)) { inputBoxSize = a.getDimensionPixelSize(R.styleable.VerifyCodeInputLayout_inputBoxSize,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 44F, resources.displayMetrics).toInt() )}if (a.hasValue(R.styleable.VerifyCodeInputLayout_dividerDrawable)) { dividerDrawable = a.getDrawable(R.styleable.VerifyCodeInputLayout_dividerDrawable)}if (a.hasValue(R.styleable.VerifyCodeInputLayout_itemSelector)) { itemSelector = a.getResourceId(R.styleable.VerifyCodeInputLayout_itemSelector, itemSelector)}if (a.hasValue(R.styleable.VerifyCodeInputLayout_maxLength)) { verifyCodeLen = a.getInt(R.styleable.VerifyCodeInputLayout_maxLength, 4)}a.recycle() } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)verifyInputLayoutHeight = measuredHeight } fun setOnCompleteListener(onCompleteListener: OnCompleteListener) {this.onCompleteListener = onCompleteListener } override fun onFinishInflate() {super.onFinishInflate()initContainer()initListener() } private fun initListener() {inputReal.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(p0: Editable?) {setVerifyCodeInputValue(p0.toString())if (p0.toString().length == verifyCodeLen) { onCompleteListener?.onComplete(p0.toString())} } override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { } override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { }}) } private fun setVerifyCodeInputValue(inputText: String) {inputTextView.forEach { it.text = '' it.isSelected = false}inputTextView.forEachIndexed { index, textView -> if (inputText.length > index) {textView.isSelected = truetextView.text = inputText[index].toString() }} } private fun initContainer() {inputReal = findViewById(R.id.inputReal)rvContentList = findViewById(R.id.rvContentList)inputReal.width = (dividerDrawable?.minimumWidth ?: 0 * (verifyCodeLen - 1)) + inputBoxSize * verifyCodeLeninputReal.height = inputBoxSizeinputReal.setTextSize(TypedValue.COMPLEX_UNIT_PX, inputTextSize * 1.0F)inputReal.isCursorVisible = falseinputReal.filters = arrayOf(InputFilter.LengthFilter(verifyCodeLen))inputTextView.clear()dividerDrawable?.let { it.setBounds(0, 0, it.minimumWidth, it.minimumHeight) rvContentList.dividerDrawable = it}for (i in 0 until verifyCodeLen) { val textView = TextView(context) textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, inputTextSize * 1.0F) textView.width = inputBoxSize textView.height = inputBoxSize textView.gravity = Gravity.CENTER textView.isFocusable = false textView.textColor = inputTextColor textView.backgroundResource = itemSelector inputTextView.add(textView)}inputTextView.forEach { rvContentList.addView(it)} } interface OnCompleteListener {fun onComplete(content: String) }}

自定義屬性

<?xml version='1.0' encoding='utf-8'?><resources> <declare-styleable name='VerifyCodeInputLayout'><attr name='textSize' format='dimension'/><attr name='textColor' format='color'/><attr name='inputBoxSize' format='dimension'/><attr name='dividerDrawable' format='reference'/><attr name='maxLength' format='integer'/><attr name='itemSelector' format='reference'/> </declare-styleable></resources>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美永久精品| 国产精品qvod| 香蕉国产精品| se01亚洲视频 | 国产精品99一区二区三区| 久久精品凹凸全集| 国产一区二区亚洲| 韩国久久久久久| 国户精品久久久久久久久久久不卡| 精品高清久久| 天堂日韩电影| 狠狠干成人综合网| 日本中文字幕一区二区| 婷婷综合国产| 国产videos久久| 成人午夜亚洲| 久久国产小视频| 三级在线观看一区二区| 日韩国产成人精品| 欧美在线不卡| 久久wwww| 日韩在线高清| 国产视频一区二区在线播放| 91伊人久久| 久久精品一区二区国产| 国产精品毛片在线| 国产精品网站在线看| 欧美日韩中文字幕一区二区三区| 最新国产精品视频| 免费在线小视频| 免费视频一区三区| 日韩三级久久| 日韩精品电影| 丝袜亚洲精品中文字幕一区| 日韩二区三区四区| 波多视频一区| 亚洲一区二区三区久久久| 麻豆精品久久久| 亚洲激情不卡| 麻豆久久久久久| 久久亚洲不卡| 久久婷婷av| 在线观看亚洲精品福利片| 美女久久久久久| 免费成人在线视频观看| 精品国产网站| 国产精品一区二区美女视频免费看| 精品一级视频| 亚洲视频国产| 日本精品不卡| 国产精品最新自拍| 麻豆9191精品国产| 国产精品毛片久久| 亚洲一区二区毛片| 麻豆国产欧美日韩综合精品二区| 亚洲国产日韩欧美在线| 欧美亚洲综合视频| 欧美好骚综合网| 欧美综合二区| 国产精品成人自拍| 日韩亚洲一区在线| 亚洲欧美一级| 国产精品国产三级国产在线观看| 国产字幕视频一区二区| 日本亚州欧洲精品不卡| 国产 日韩 欧美 综合 一区 | 综合激情婷婷| 欧美aⅴ一区二区三区视频| 999久久久亚洲| 国产亚洲久久| 91精品在线观看国产| 日韩有码av| 午夜精品成人av| 欧美综合精品| 日韩视频在线一区二区三区| 精品入口麻豆88视频| 性色av一区二区怡红| 精品国产午夜| 亚洲免费观看高清完整版在线观| 国产一区二区三区四区二区| 综合一区在线| 国产麻豆久久| 国产极品久久久久久久久波多结野| 夜久久久久久| 红杏一区二区三区| 免费观看不卡av| 久久三级毛片| 18国产精品| 综合国产视频| 91精品在线观看国产| 日韩欧美一区二区三区在线视频 | 麻豆久久一区二区| 视频精品一区二区| 亚洲午夜电影| 国产a亚洲精品| 日韩1区2区| 麻豆91在线播放| 青草综合视频| 欧美中文日韩| 欧美一区三区| 日韩高清成人| 捆绑调教日本一区二区三区| 国产欧美三级| 影音先锋久久精品| 日韩精品乱码av一区二区| 红桃视频国产精品| 欧美性感美女一区二区| 亚洲国产欧美日本视频| 国产精选久久| 欧美日韩黄网站| 亚洲精品影视| 一区二区三区四区日韩| 午夜在线视频观看日韩17c| 久久中文亚洲字幕| 国产一区二区三区四区大秀| 国产欧美一区二区三区米奇| 日韩不卡一区二区| 亚洲欧洲专区| 日韩精品一二区| 99热精品在线观看| 欧美午夜不卡| 99视频在线精品国自产拍免费观看| 欧美.日韩.国产.一区.二区| 国产福利91精品一区二区| 黄色网一区二区| 激情中国色综合| av高清不卡| 久久久精品五月天| 国产在线欧美| 美女网站一区| 手机精品视频在线观看| 蜜桃av一区二区| 久久av一区| 国产欧美日韩影院| 麻豆视频久久| 日韩av在线播放网址| 欧美三级精品| 亚洲精品成人| 亚洲精品系列| 欧美国产视频| 国产精品啊v在线| 中文字幕系列一区| 久久国产精品久久久久久电车 | 亚洲日韩中文字幕一区| 在线观看一区| 国产精品中文| 麻豆精品在线播放| 午夜亚洲精品| 日韩av二区在线播放| 国产精品一区二区中文字幕| 福利欧美精品在线| 欧美va天堂在线| 亚洲精品大全| 久久精品国产免费| 欧洲av不卡| 久久亚洲风情| 国产一区一一区高清不卡| 日本不卡免费高清视频在线| 亚洲自啪免费| 国产一精品一av一免费爽爽| 欧美激情另类| 免费人成精品欧美精品| 国产精品第一国产精品| 久久不射中文字幕| 国产精品极品在线观看| 精品丝袜在线| 日韩视频一二区| 福利精品在线| 亚洲另类av| 久久精品国产在热久久| 99久久婷婷这里只有精品| 五月天久久久| 亚洲精品影视| 日韩大片在线| 深夜日韩欧美| 久久人人99| 亚洲欧美在线专区| 亚洲播播91| 国产亚洲电影| 日韩欧美一区二区三区免费看| 久久黄色影视| 激情五月综合网| 国产精品白丝av嫩草影院| 九九久久婷婷| 久久中文字幕一区二区三区| 国产精品日韩久久久| 精品日韩在线| 亚洲欧美激情诱惑| 国产一区二区三区91| 日韩欧美中文在线观看| 99久久www免费| 美日韩一区二区三区| 蜜臀va亚洲va欧美va天堂| 国产欧美一区二区三区精品酒店| 亚洲美女91| 婷婷成人在线| 成人啊v在线| 精品精品国产三级a∨在线| 亚久久调教视频| 99视频精品全国免费|