安卓开发:自定义组合控件布局(kotlin语言)

本文介绍了如何在安卓开发中利用Kotlin语言创建自定义的组合控件布局。通过布局文件的设计,自定义布局类的编写,以及具体的使用示例,详细阐述了这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/idInputLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="visible"
    tools:context=".MyInputNumberView">>

    <Button
        android:id="@+id/idInput0"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="0"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput9"
        app:layout_constraintTop_toBottomOf="@+id/idInput5" />

    <Button
        android:id="@+id/idInput6"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="6"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/idInput1" />

    <Button
        android:id="@+id/idInput7"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="7"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput6"
        app:layout_constraintTop_toBottomOf="@+id/idInput2" />

    <Button
        android:id="@+id/idInput8"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="8"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput7"
        app:layout_constraintTop_toBottomOf="@+id/idInput3" />

    <Button
        android:id="@+id/idInput9"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="9"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput8"
        app:layout_constraintTop_toBottomOf="@+id/idInput4" />

    <Button
        android:id="@+id/idInput5"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="5"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput4"
        app:layout_constraintTop_toTopOf="@+id/idInput3" />

    <Button
        android:id="@+id/idInput4"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="4"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput3"
        app:layout_constraintTop_toTopOf="@+id/idInput3" />

    <Button
        android:id="@+id/idInput3"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="3"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput2"
        app:layout_constraintTop_toBottomOf="@+id/idInputText" />

    <Button
        android:id="@+id/idInput2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="2"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toEndOf="@+id/idInput1"
        app:layout_constraintTop_toTopOf="@+id/idInput3" />

    <Button
        android:id="@+id/idInputDec"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="-"
        app:cornerRadius="5dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/idInputAdd"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="+"
        app:cornerRadius="5dp"
        app:layout_constraintStart_toEndOf="@+id/idInputText"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/idInput1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:text="1"
        android:textAlignment="center"
        app:cornerRadius="50dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/idInputDec" />

    <EditText
        android:id="@+id/idInputText"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:autoSizeTextType="uniform"
        android:editable="true"
        android:ems="10"
        android:inputType="text"
        app:layout_constraintEnd_toStartOf="@+id/idInputAdd"
        app:layout_constraintStart_toEndOf="@+id/idInputDec"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/idInputDel"
        android:layout_width="70dp"
        android:layout_height="0dp"
        android:autoSizeTextType="uniform"
        android:text="del"
        app:cornerRadius="20dp"
        app:layout_constraintBottom_toTopOf="@+id/idInput5"
        app:layout_constraintStart_toEndOf="@+id/idInputAdd"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/idInputComfirm"
        android:layout_width="70dp"
        android:layout_height="0dp"
        android:autoSizeTextType="uniform"
        android:text="@string/str_confirm"
        android:textColor="@color/orange"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/idInput0"
        app:layout_constraintTop_toBottomOf="@+id/idInputDel" />
</androidx.constraintlayout.widget.ConstraintLayout>

布局类

package xuganquan.app.topwisdom

import android.content.Context
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import xuganquan.app.topwisdom.databinding.MylayoutInputNumberBinding

interface IOnMyInputChange{
    fun onMyInputChange(str: String)
}

class MyInputNumberView: ConstraintLayout {
    private lateinit var binding: MylayoutInputNumberBinding

    /*private var mDec:Button?= null
    private var mAdd:Button?= null
    private var mDel:Button?= null
    private var mConfirm:Button?= null
    private var mText:TextView?= null


    private var mInput1:Button?= null
    private var mInput2:Button?= null
    private var mInput3:Button?= null
    private var mInput4:Button?= null
    private var mInput5:Button?= null
    private var mInput6:Button?= null
    private var mInput7:Button?= null
    private var mInput8:Button?= null
    private var mInput9:Button?= null
    private var mInput0:Button?= null*/

    private var mValueStr:String= "0"
    public lateinit var mlistener:IOnMyInputChange

    constructor(context: Context):super(context){
        binding=MylayoutInputNumberBinding.inflate(LayoutInflater.from(context),this,true)
        binding.idInputText.setText("")  //.text baocuo
        setUpEvent()
    }


    init{
/*
        mDec=bindingView.findViewById<Button>(R.id.idInputDec)
        mAdd=bindingView.findViewById<Button>(R.id.idInputAdd)
        mDel=bindingView.findViewById<Button>(R.id.idInputDel)
        mConfirm=bindingView.findViewById<Button>(R.id.idInputComfirm)
        mText=bindingView.findViewById<TextView>(R.id.idInputText)


        mInput1=bindingView.findViewById<Button>(R.id.idInput1)
        mInput2=bindingView.findViewById<Button>(R.id.idInput2)
        mInput3=bindingView.findViewById<Button>(R.id.idInput3)
        mInput4=bindingView.findViewById<Button>(R.id.idInput4)
        mInput5=bindingView.findViewById<Button>(R.id.idInput5)
        mInput6=bindingView.findViewById<Button>(R.id.idInput6)
        mInput7=bindingView.findViewById<Button>(R.id.idInput7)
        mInput8=bindingView.findViewById<Button>(R.id.idInput8)
        mInput9=bindingView.findViewById<Button>(R.id.idInput9)
        mInput0=bindingView.findViewById<Button>(R.id.idInput0)*/

    }


    // 4. 处理事件
    private fun setUpEvent() {
        binding.idInputText.addTextChangedListener( object: TextWatcher {
            override fun afterTextChanged(s: Editable) {}
            override fun beforeTextChanged(
                s: CharSequence,
                start: Int,
                count: Int,
                after: Int
            ) {
            }

            override fun onTextChanged(
                s: CharSequence,
                start: Int,
                before: Int,
                count: Int
            ) {
               // listener?.onMyInputChange(mValueStr)
            }
        })

        binding.idInputDec.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            var mValueInt=mValueStr.toIntOrNull()
            if(null==mValueInt)
                 mValueInt=0
            else
                mValueInt-=1
            mValueStr=mValueInt.toString()
            updateValueText()
        }
        binding.idInputAdd.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            var mValueInt2=mValueStr.toIntOrNull()
            if(null==mValueInt2)
                mValueInt2=0
            else
                mValueInt2 += 1

            mValueStr=mValueInt2.toString()
            updateValueText()
        }
        binding.idInputDel.setOnClickListener {
            mValueStr=""
            updateValueText()
        }

        binding.idInputComfirm.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mlistener.onMyInputChange(mValueStr)
        }

        binding.idInput1.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="1"
            updateValueText()
        }
        binding.idInput2.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="2"
            updateValueText()
        }
        binding.idInput3.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="3"
            updateValueText()
        }
        binding.idInput4.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="4"
            updateValueText()
        }
        binding.idInput5.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="5"
            updateValueText()
        }
        binding.idInput6.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="6"
            updateValueText()
        }
        binding.idInput7.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="7"
            updateValueText()
        }
        binding.idInput8.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="8"
            updateValueText()
        }
        binding.idInput9.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="9"
            updateValueText()
        }
        binding.idInput0.setOnClickListener {
            mValueStr=binding.idInputText.text.toString()
            mValueStr+="0"
            updateValueText()
        }

    }
    private fun updateValueText() {
        binding.idInputText.setText(mValueStr)  //.textbaocuo
    }


}

使用示例

val inputView1 = MyInputNumberView(mLayout.context).apply {
    visibility = View.INVISIBLE
    id = mNewID++
    layoutParams = ConstraintLayout.LayoutParams(mWidth, mHeight).apply {

        startToStart = mID
        topToTop = mID
        //endToEnd = mID
        //bottomToBottom = mID

        leftMargin = mViewMargins[1][0]
        topMargin = mViewMargins[1][1]
        //rightMargin =mViewMargins[1][2]
        // bottomMargin=mViewMargins[1][3]

        //width = mViewSizes[1][0]
        //height = mViewSizes[1][1]

    }

    mLayout.addView(this)
    visibility = View.VISIBLE
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值