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

您的位置:首頁技術文章
文章詳情頁

Android自定義view實現TextView方形輸入框

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

本文實例為大家分享了Android自定義view實現TextView方形輸入框的具體代碼,供大家參考,具體內容如下

先奉上最終效果圖

Android自定義view實現TextView方形輸入框

實現思路分析:

1、 使用一個LinearLayout用來填充每一個小方格,通過動態添加,實現出需要數量的輸入框2、 在LinearLayout上覆蓋一層大小和LinearLayout大小完全一致的EditText,用來接口輸入信息,設置EditText輸入背景和文字為透明,并設置不展示光標,3、 監聽EditText的內容變化,和LinearLayout的內容綁定,實現每次輸入都由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>

在代碼中動態創建LinearLayout子布局填充,并綁定監聽

private fun initContainer() { //動態設置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) //禁用光標inputReal.isCursorVisible = falseinputReal.filters = arrayOf(InputFilter.LengthFilter(verifyCodeLen))inputTextView.clear() //動態添加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()} }}

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

最后放上完整源代碼:

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)//設置默認值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>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人片免费看| 久色成人在线| 国产精品成人自拍| 欧美久久久网站| 久久狠狠久久| 国产激情综合| 高清av一区| 日本不卡免费高清视频在线| sm久久捆绑调教精品一区| 91视频精品| 日韩不卡视频在线观看| 日韩精品网站| 欧美另类综合| 亚洲理论在线| 国产一区 二区| 嫩草伊人久久精品少妇av杨幂| 欧美亚洲自偷自偷| 国产欧美丝祙| 福利在线一区| 婷婷亚洲五月色综合| 国产亚洲综合精品| 日本综合精品一区| 国产欧美久久一区二区三区| 国产美女精品视频免费播放软件| 国产精品成人一区二区不卡| 欧美精品国产| 国产欧美日韩影院| 激情综合五月| 国产精品日本一区二区不卡视频| 日韩国产在线不卡视频| 国产乱码精品一区二区三区四区| 欧美一区二区三区免费看| 国产精品片aa在线观看 | 久久字幕精品一区| 高清不卡亚洲| 欧美日韩免费观看一区=区三区 | 四虎在线精品| 国产激情精品一区二区三区| sm久久捆绑调教精品一区| 久久精品主播| 蜜臀久久久久久久| 老色鬼精品视频在线观看播放| 国产精品不卡| 国产精品毛片在线看| 国产精品网在线观看| 日韩大片免费观看| 亚洲资源网站| 97国产精品| 中文字幕av亚洲精品一部二部| 免费日韩成人| 欧美日韩少妇| 麻豆免费精品视频| 狠狠干综合网| 久久香蕉精品香蕉| 影院欧美亚洲| 久久精品国产福利| 国产日韩综合| 老司机免费视频一区二区| 一区久久精品| 精品一区二区三区亚洲| 午夜在线一区| 神马午夜在线视频| 欧美一区影院| 91久久中文| bbw在线视频| 日韩一区二区三区四区五区| 樱桃视频成人在线观看| 日韩1区2区日韩1区2区| 亚洲一级影院| 精品中文在线| 综合色一区二区| 91精品国产成人观看| 国产欧美三级| 亚洲v在线看| 国产激情精品一区二区三区| 国产日韩专区| 国模精品一区| 日韩不卡免费视频| 午夜免费一区| 亚洲精品**中文毛片| 国产日韩欧美三区| 亚洲精品综合| 91精品国产成人观看| 国产精品宾馆| 国产亚洲高清在线观看| 国产精品宾馆| 精品国产亚洲日本| 国产精品www.| 亚洲伊人精品酒店| 欧美精品99| 亚洲电影在线一区二区三区| 日韩不卡一区| 成人日韩av| 日本aⅴ免费视频一区二区三区| 久久一区二区三区喷水| 久久精品97| 丝袜a∨在线一区二区三区不卡| 国内不卡的一区二区三区中文字幕| 亚洲精品视频一二三区| 欧美1区免费| 鲁鲁在线中文| 色一区二区三区四区| 久久爱www成人| 亚洲免费影视| 视频一区二区三区在线| 国产亚洲一区| 四虎成人精品一区二区免费网站| 久久一区视频| 亚洲日产国产精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品tv| 美女毛片一区二区三区四区| 99久精品视频在线观看视频| 丝袜脚交一区二区| 久久亚州av| 好看的av在线不卡观看| 麻豆国产一区| 日韩一区精品| 午夜电影亚洲| 91tv亚洲精品香蕉国产一区| 蜜桃av一区二区在线观看| 亚州欧美在线| 精品女同一区二区三区在线观看| 久久亚洲欧洲| 激情丁香综合| 精品国产成人| 国产欧美日韩综合一区在线播放| 高清av一区| 电影91久久久| 精品国产中文字幕第一页| 亚洲精品极品| 亚洲精品九九| 中文字幕成人| 亚洲日本久久| 免费精品视频| 美女在线视频一区| 麻豆高清免费国产一区| 日韩av中文字幕一区| 日韩三级精品| 日本天堂一区| 日本少妇精品亚洲第一区| 亚洲综合欧美| 五月天av在线| 亚洲网站视频| 麻豆久久久久久久| 精品国产精品国产偷麻豆 | 日本精品不卡| 国产aa精品| 99久久99久久精品国产片果冰 | 中文在线а√天堂| 国内精品伊人| 国产伦一区二区三区| 亚洲精品看片| 一区二区三区午夜视频| 日本国产亚洲| 久久xxx视频| 国产主播一区| 国产福利亚洲| 婷婷综合网站| 蜜臀久久久久久久| 蜜桃久久av一区| 免费在线欧美视频| 日韩欧美美女在线观看| 国产精品福利在线观看播放| 视频一区中文字幕国产| 国产亚洲电影| 国产精品天堂蜜av在线播放| 精品女同一区二区三区在线观看| 欧美羞羞视频| 亚洲精华国产欧美| 日韩综合小视频| 日韩精品第一区| 亚洲精品一级| 国产综合视频| 欧美天堂一区二区| 电影91久久久| 国产拍在线视频| 国产精品久久久久久久久久白浆| 92国产精品| 久久香蕉网站| 日韩亚洲精品在线观看| 国产日韩欧美三区| 国产999精品在线观看| 91九色精品国产一区二区| 狠狠色综合网| 免费久久精品视频| 影视先锋久久| 美女福利一区二区三区| 欧美一区影院| 日韩欧美久久| 亚洲欧洲一区| www在线观看黄色| 欧美久久香蕉| 国产精品精品| 成人亚洲一区| 国产精品日本| 日韩不卡免费高清视频| 老鸭窝一区二区久久精品| 91精品一区| 国产视频网站一区二区三区|