电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:130日期: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
相關文章:
主站蜘蛛池模板: 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 家乐事净水器官网-净水器厂家「官方」 | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 电子元器件呆滞料_元器件临期库存清仓尾料_尾料优选现货采购处理交易商城 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 拖链电缆_柔性电缆_伺服电缆_坦克链电缆-深圳市顺电工业电缆有限公司 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | 济南宣传册设计-画册设计_济南莫都品牌设计公司 | BAUER减速机|ROSSI-MERSEN熔断器-APTECH调压阀-上海爱泽工业设备有限公司 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 一体式钢筋扫描仪-楼板测厚仪-裂缝检测仪-泰仕特(北京) | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | 压力变送器-上海武锐自动化设备有限公司 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 工控机-工业平板电脑-研华工控机-研越无风扇嵌入式box工控机 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 精密模具加工制造 - 富东懿| 模具钢_高速钢_不锈钢-万利钢金属材料| 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 |