{"id":23960979,"url":"https://github.com/davidmigloz/number-keyboard","last_synced_at":"2025-04-13T10:10:22.364Z","repository":{"id":43242921,"uuid":"97727759","full_name":"davidmigloz/number-keyboard","owner":"davidmigloz","description":"Android library that provides a simple number keyboard view.","archived":false,"fork":false,"pushed_at":"2024-03-07T03:17:45.000Z","size":668,"stargazers_count":128,"open_issues_count":1,"forks_count":37,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-27T01:35:30.196Z","etag":null,"topics":["android","keyboard"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davidmigloz.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2017-07-19T14:44:03.000Z","updated_at":"2024-11-15T18:31:38.000Z","dependencies_parsed_at":"2024-03-05T05:27:23.816Z","dependency_job_id":"c80da6dd-45ad-4973-8c1c-8353a67c0c87","html_url":"https://github.com/davidmigloz/number-keyboard","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidmigloz%2Fnumber-keyboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidmigloz%2Fnumber-keyboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidmigloz%2Fnumber-keyboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidmigloz%2Fnumber-keyboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davidmigloz","download_url":"https://codeload.github.com/davidmigloz/number-keyboard/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248695481,"owners_count":21146956,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","keyboard"],"created_at":"2025-01-06T19:58:38.363Z","updated_at":"2025-04-13T10:10:22.341Z","avatar_url":"https://github.com/davidmigloz.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Number Keyboard  [![](https://jitpack.io/v/davidmigloz/number-keyboard.svg)](https://jitpack.io/#davidmigloz/number-keyboard)\n\nAndroid library that provides a number keyboard composable.\n\n![screenshot](img/screenshot.png)\n\n## Usage\n\n### Step 1\n\nAdd the JitPack repository to your `build.gradle` file:\n\n```gradle\nallprojects {\n\trepositories {\n\t\t...\n\t\tmaven { url \"https://jitpack.io\" }\n\t}\n}\n```\n\n### Step 2\n\nAdd the dependency:\n\n```gradle\ndependencies {\n\timplementation 'com.github.davidmigloz:number-keyboard:4.0.6'\n}\n```\n\n[CHANGELOG](https://github.com/davidmigloz/number-keyboard/blob/master/CHANGELOG.md)\n\n\u003e **Note:** in v4.0.0 the library was migrated to Jetpack Compose. If you need to old Android View based version, please keep using [v3.1.0](https://github.com/davidmigloz/number-keyboard/tree/3.1.0) instead.\n\n### Step 3\n\n#### Use `NumberKeyboard` Composable in your layout:\n\n```kotlin\nNumberKeyboard(\n  maxAllowedAmount = 999.00,\n  maxAllowedDecimals = 0,\n  roundUpToMax = false,\n  button = { number, clickedListener -\u003e\n    NumberKeyboardButton(\n      modifier = buttonModifier,\n      textStyle = buttonTextStyle,\n      number = number,\n      listener = clickedListener\n    )\n  },\n  leftAuxButton = { _ -\u003e\n    NumberKeyboardAuxButton(\n      modifier = buttonModifier,\n      textStyle = buttonTextStyle,\n      imageVector = Icons.Rounded.Fingerprint,\n      clicked = { Toast.makeText(context, \"Triggered\", Toast.LENGTH_SHORT).show() }\n    )\n  },\n  rightAuxButton = { clickedListener -\u003e\n    NumberKeyboardAuxButton(\n      modifier = buttonModifier,\n      textStyle = buttonTextStyle,\n      imageVector = Icons.Rounded.Backspace,\n      clicked = { clickedListener.onRightAuxButtonClicked() }\n    )\n  },\n  listener = object : NumberKeyboardListener {\n    override fun onUpdated(data: NumberKeyboardData) {\n      text = data.int.toString()\n    }\n  }\n)\n```\n\n##### Attribute\n\n- `initialAmount` - Double (default: 0.0): Initial amount for `NumberKeyboard` output\n- `maxAllowedAmount` - Double (default: 10_000.0): Maximum amount allowed for the `NumberKeyboard` output\n- `maxAllowedDecimals` - Int (default: 2): Maximum decimal points allowed for the `NumberKeyboard` output\n- `currencySymbol` - String (default: \"$\"): Currency symbol for the `NumberKeyboardData` currency format output\n- `isInverted` - Boolean (default: false): Default number sequence is the phone number pad sequence, inverted is the calculator number pad sequence\n- `roundUpToMax` - Boolean (default: true): Behaviour to round up to the max allowed amount if amount has exceeded\n- `verticalArrangement` - Arrangement.HorizontalOrVertical (default: 8.dp): Vertical spacing between the buttons\n- `horizontalArrangement` - Arrangement.HorizontalOrVertical (default: 8.dp): Horizontal spacing between the buttons\n- `decimalSeparator` - Char (default: DecimalFormat.decimalFormatSymbols.decimalSeparator): Character for decimal separator\n- `groupingSeparator` - Char (default: DecimalFormat.decimalFormatSymbols.groupingSeparator): Character for grouping separator\n\n##### Composable \n\nTo harness the power and flexibility of Jetpack Compose, `NumberKeyboard` now provides `@Composable` lambdas that gives you control over all the button layouts.\nThus, you can easily customise it with shadows, different shapes or even different locales!\n\n1) `button: @Composable (Int, NumberKeyboardClickedListener) -\u003e Unit,`\n- `value` - Int: Number of the button pressed\n- `listener` - NumberKeyboardClickedListener: Click listener for all buttons, left aux button and right aux button if applicable.\n\n2) `leftAuxButton, rightAuxButton: @Composable ((NumberKeyboardClickedListener) -\u003e Unit)? = null`\n- `listener` - NumberKeyboardClickedListener: Click listener for all buttons, left aux button and right aux button if applicable.\n\nFor `NumberKeyboardClickedListener`, it is a click listener for all buttons in `NumberKeyboard`. \nInside `NumberKeyboard`, there is a `NumberKeyboardClickedListener` instance that will be used to format the output through `NumberKeyboardListener`.\n\nIf you wish to have more control, you can easily just have a `NumberKeyboardClickedListener` at your Fragment level.\n\n```kotlin\ninterface NumberKeyboardClickedListener {\n    fun onNumberClicked(number: Int)\n    fun onLeftAuxButtonClicked()\n    fun onRightAuxButtonClicked()\n}\n```\n\nThere is an out-of-box `NumberKeyboardButton` that you can use to quickly get started, it's basically a wrapped `OutlineButton.Text`.\n\n```kotlin\n@Composable\nfun NumberKeyboardButton(\n    modifier: Modifier,\n    textStyle: TextStyle,\n    shape: Shape = RoundedCornerShape(size = 8.dp),\n    haptics: HapticFeedback = LocalHapticFeedback.current,\n    number: Int,\n    listener: NumberKeyboardClickedListener\n) {\n    OutlinedButton(\n        modifier = modifier,\n        shape = shape,\n        border = BorderStroke(1.dp, Color.LightGray),\n        onClick = {\n            haptics.performHapticFeedback(HapticFeedbackType.LongPress)\n            listener.onNumberClicked(number)\n        }\n    ) {\n        Text(\n            text = number.toString(),\n            style = textStyle\n        )\n    }\n}\n```\n\n##### NumberKeyboardListener\n\nThis listener is _optional_, but if you want to utilise this. Make sure that the `NumberKeyboardClickedListener` is configured properly when you are building your button layouts.\nAfter configuration, it will provide `NumberKeyboardData` that has the `rawAmount` from the `NumberKeyboard` inout and it's variation of Integer and Float variable types.  \n\n```kotlin\ninterface NumberKeyboardListener {\n    fun onUpdated(data: NumberKeyboardData)\n}\n\nclass NumberKeyboardData(\n  amount: String,\n  private val decimalSeparator: Char,\n  private val groupingSeparator: Char,\n  private val currencySymbol: String\n) {\n  val rawAmount: String = amount.ifEmpty { \"0\" }\n\n  // Integer\n  val byte: Byte\n    get() = rawAmount.normaliseNumber().toInt().toByte()\n\n  val short: Short\n    get() = rawAmount.normaliseNumber().toInt().toShort()\n\n  val int: Int\n    get() = rawAmount.normaliseNumber().toInt()\n\n  val long: Long\n    get() = rawAmount.normaliseNumber().toLong()\n\n  // Floating-point\n  val float: Float\n    get() = rawAmount.normaliseNumber().toFloat()\n\n  val double: Double\n    get() = rawAmount.normaliseNumber()\n\n  val currency: String\n    get() = formatCurrency(rawAmount, decimalSeparator, groupingSeparator, currencySymbol)\n}\n```\n\n##### Examples\n\n1) Integer `NumberKeyboard`\n  [Sample](https://github.com/davidmigloz/number-keyboard/blob/master/sample/src/main/java/com/davidmiguel/sample/IntegerScreen.kt)\n\n```kotlin\nval maxAllowedDecimals: Int = 0\n```\n\n2) Decimal `NumberKeyboard`\n   [Sample](https://github.com/davidmigloz/number-keyboard/blob/master/sample/src/main/java/com/davidmiguel/sample/DecimalScreen.kt)\n\n```kotlin\nval maxAllowedAmount: Double = 10_000.00\nval maxAllowedDecimals: Int = 2\nval currencySymbol: String = \"$\"\n```\n\n3) Biometric `NumberKeyboard`\n   [Sample](https://github.com/davidmigloz/number-keyboard/blob/master/sample/src/main/java/com/davidmiguel/sample/BiometricScreen.kt)\n\n```kotlin\nval maxAllowedAmount: Double = 9_999.0\nval maxAllowedDecimals: Int = 0\nval roundUpToMax: Boolean = false\n```\n\n4) Custom `NumberKeyboard`\n   [Sample](https://github.com/davidmigloz/number-keyboard/blob/master/sample/src/main/java/com/davidmiguel/sample/CustomScreen.kt)\n\n```kotlin\nval maxAllowedAmount: Double = 8_888.88\nval maxAllowedDecimals: Int = 3\nval currencySymbol: String = \"€\"\nval isInverted: Boolean = true\n```\n\n---\n\n#### Use `NumberKeyboard` AndroidView \u003c= [v3.1.0](https://github.com/davidmigloz/number-keyboard/tree/3.1.0) XML view  in your layout:\n\n```xml\n\u003ccom.davidmiguel.numberkeyboard.NumberKeyboard\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:keyboard=\"http://schemas.android.com/apk/res-auto\"\n    ...\n    keyboard:numberkeyboard_keyboardType=\"integer\"\n    ... /\u003e\n```\n\n##### Attributes\n\n- `keyboard:numberkeyboard_keyboardType=\"[integer|decimal|fingerprint|custom]\"` (required): defines the type of keyboard.\n    - `integer`: numbers and backspace keys.\n    - `decimal`: numbers, comma and backspace keys.\n    - `fingerprint`: numbers, fingerprint and backspace keys.\n    - `custom`: numbers and defined auxiliary keys.\n- `keyboard:numberkeyboard_keyWidth=\"[dimension]\"` (default: `match_parent`): key width (`wrap_content` not allowed).\n- `keyboard:numberkeyboard_keyHeight=\"[dimension]\"` (default: `match_parent`): key height (`wrap_content` not allowed).\n- `keyboard:numberkeyboard_keyPadding=\"[dimension]\"` (default: `16dp`): key padding.\n- `keyboard:numberkeyboard_numberKeyBackground=\"[reference]\"` (default: circle): number keys background drawable.\n- `keyboard:numberkeyboard_numberKeyTextColor=\"[reference]\"` (default: dark blue): number keys text color.\n- `keyboard:numberkeyboard_numberKeyTypeface=\"[reference]\"` (default: dark blue): number keys text color.\n- `keyboard:numberkeyboard_numberKeyTypeface=\"[reference]\"` (default: none): number keys text typeface.\n- `keyboard:numberkeyboard_numberKeyTextSize=\"[dimension]\"` (default: none): number keys text size (if it is not set, the text auto scales to fit the key).\n- `keyboard:numberkeyboard_leftAuxBtnBackground=\"[reference]\"` (default: none): if `keyboardType=\"custom\"`, left auxiliary button background.\n- `keyboard:numberkeyboard_rightAuxBtnIcon=\"[reference]\"` (default: none): if `keyboardType=\"custom\"`, icon shown in right auxiliary button.\n- `keyboard:numberkeyboard_rightAuxBtnBackground=\"[reference]\"` (default: none): if `keyboardType=\"custom\"`, right auxiliary button background.\n\n##### Methods\n\n- `hideLeftAuxButton()`: hides left auxiliary button.\n- `showLeftAuxButton()`: shows left auxiliary button.\n- `hideRightAuxButton()`: hides right auxiliary button.\n- `showRightAuxButton()`: shows right auxiliary button.\n- `setKeyWidth()`: sets key width in px.\n- `setKeyHeight()`: sets key height in px.\n- `setKeyPadding()`: sets key padding in px.\n- `setNumberKeyBackground()`: sets number keys background.\n- `setNumberKeyTextColor()`: sets number keys text color.\n- `setNumberKeyTypeface()`: sets number keys text typeface.\n- `setNumberKeyTextSize()`: sets number keys text size in pixels.\n- `setLeftAuxButtonIcon()`: sets left auxiliary button icon.\n- `setRightAuxButtonIcon()`: sets right auxiliary button icon.\n- `setLeftAuxButtonBackground()`: sets left auxiliary button background.\n- `setRightAuxButtonBackground()`: sets right auxiliary button background.\n\n##### Callback\n\nTo listen to keyboard events, you have to use `NumberKeyboardListener`:\n\n- `onNumberClicked()`: invoked when a number key is clicked.\n- `onLeftAuxButtonClicked()`: invoked when the left auxiliary button is clicked.\n- `onRightAuxButtonClicked()`: invoked when the right auxiliary button is clicked.\n\n```kotlin\n numberKeyboard.setListener(object: NumberKeyboardListener {\n    override fun onNumberClicked(number: Int) {\n        ...\n    }\n\n    override fun onLeftAuxButtonClicked() {\n        ...\n    }\n\n    override fun onRightAuxButtonClicked() {\n        ...\n    }\n})\n```\n\n\nTake a look at the [sample app](https://github.com/davidmigloz/number-keyboard/tree/master/sample) to see the library working.\n\n## Contributing\n\nIf you find any issues or you have any questions, ideas... feel free to [open an issue](https://github.com/davidmigloz/number-keyboard/issues/new).\nPull request are very appreciated.\n\n## License\n\nCopyright (c) 2023 David Miguel Lozano / Morgan Koh\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidmigloz%2Fnumber-keyboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidmigloz%2Fnumber-keyboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidmigloz%2Fnumber-keyboard/lists"}