• Android EditText限制只能输入整数和小数,且数字总长度小于等于11位(可自定义),整数5位(可自定义),小数5位(可自定义)


    1、修改页面的layout。

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical"
    7. tools:context=".MineActivity">
    8. <View
    9. android:layout_width="match_parent"
    10. android:layout_height="@dimen/dp_50" />
    11. <EditText
    12. android:id="@+id/edt_input"
    13. android:layout_width="@dimen/dp_280"
    14. android:layout_height="@dimen/dp_40"
    15. android:layout_gravity="center_horizontal"
    16. android:background="@drawable/corners_14_color_white_stroke_1_color_80000000"
    17. android:gravity="center"
    18. android:textColor="@color/colorBlack333"
    19. android:textSize="@dimen/sp_16"
    20. tools:ignore="Autofill,LabelFor,TextFields" />
    21. <View
    22. android:layout_width="match_parent"
    23. android:layout_height="@dimen/dp_50" />
    24. <TextView
    25. android:id="@+id/tev_input"
    26. android:layout_width="wrap_content"
    27. android:layout_height="@dimen/dp_40"
    28. android:layout_gravity="center_horizontal"
    29. android:background="@drawable/corners_14_color_white_stroke_1_color_80000000"
    30. android:gravity="center"
    31. android:paddingStart="@dimen/dp_10"
    32. android:paddingEnd="@dimen/dp_10"
    33. android:text="input"
    34. android:textColor="@color/black"
    35. android:textSize="@dimen/sp_16" />
    36. LinearLayout>

    2、初始化EditText,并设置输入数字总长度小于等于11位(可自定义),整数5位(可自定义),小数5位(可自定义)。

    1. EditText edtInput = (EditText) findViewById(R.id.edt_input);
    2. TextView tevConfirm = (TextView) findViewById(R.id.tev_confirm);
    3. tevInput.setOnClickListener(v -> {
    4. showDecimalAlertDialog();
    5. });

    3、添加showDecimalAlertDialog方法,注意:如果输入特殊小数或整数,如:.或.15或10.或00035或输入21153.67589,然后删除中间小数点,整数就是10位了(整数不能大于5位),则要在点击Dialog确认按钮之前进行提示,这样就不会填入不符合规范的整数或小数了。

    1. private void showDecimalAlertDialog() {
    2. View view = LayoutInflater.from(this).inflate(R.layout.dialog_decimal_layout, null, false);
    3. EditText edtInput = (EditText) view.findViewById(R.id.edt_input);
    4. TextView tevCancel = (TextView) view.findViewById(R.id.tev_cancel);
    5. TextView tevConfirm = (TextView) view.findViewById(R.id.tev_confirm);
    6. //小数点前边几位(修改这里可以自定义)
    7. int beforeDecimalNum = 5;
    8. //小数点后边几位(修改这里可以自定义)
    9. int afterDecimalNum = 5;
    10. //最大长度是多少位(修改这里可以自定义)
    11. int maxLength = 11;
    12. //输入的类型可以是整数或小数
    13. edtInput.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
    14. DecimalInputFilter decimalInputFilter = new DecimalInputFilter(beforeDecimalNum, afterDecimalNum);
    15. //输入总长度多少位,小数几位(修改这里可以自定义)
    16. InputFilter[] inputFilter = {new InputFilter.LengthFilter(maxLength), decimalInputFilter};
    17. edtInput.setFilters(inputFilter);
    18. edtInput.addTextChangedListener(new DecimalTextWatcher(edtInput, afterDecimalNum));
    19. @SuppressLint("RestrictedApi")
    20. AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.dialog_decimal_style)
    21. .setView(view, 0, 0, 0, 0)
    22. .show();
    23. // int widthPx = ScreenManager.getScreenWidth(this);
    24. // int widthDp = ScreenManager.pxToDp(this, widthPx);
    25. // int heightPx = ScreenManager.getScreenHeight(this);
    26. // int heightDp = ScreenManager.pxToDp(this, heightPx);
    27. // LogManager.i(TAG, "widthDp*****" + widthDp);
    28. // LogManager.i(TAG, "heightDp*****" + heightDp);
    29. tevCancel.setOnClickListener(v -> {
    30. MineInputMethodManager.hideInputMethod(this);
    31. alertDialog.dismiss();
    32. });
    33. tevConfirm.setOnClickListener(v -> {
    34. String afterData = edtInput.getText().toString();
    35. if (!"".equals(afterData)) {
    36. if (afterData.contains(".")) {
    37. String[] afterDataArr = afterData.split("\\.");
    38. if ("".equals(afterDataArr[0])) {
    39. Toast.makeText(this, "请输入正常整数或小数", Toast.LENGTH_SHORT).show();
    40. } else if (afterDataArr.length == 1) {//当afterData是这种类型的小数时(0. 100.)
    41. Toast.makeText(this, "请输入正常整数或小数", Toast.LENGTH_SHORT).show();
    42. } else {
    43. this.edtInput.setText(edtInput.getText().toString());
    44. alertDialog.dismiss();
    45. }
    46. } else {
    47. if (afterData.length() <= beforeDecimalNum) {
    48. String[] afterDataArr = afterData.split("");
    49. if (afterDataArr.length > 1 && "0".equals(afterDataArr[1])) {
    50. Toast.makeText(this, "请输入正常整数或小数", Toast.LENGTH_SHORT).show();
    51. } else {
    52. this.edtInput.setText(edtInput.getText().toString());
    53. alertDialog.dismiss();
    54. }
    55. } else {
    56. Toast.makeText(this, "整数长度不能大于" + beforeDecimalNum + "位", Toast.LENGTH_SHORT).show();
    57. }
    58. }
    59. } else {
    60. Toast.makeText(this, "请输入整数或小数", Toast.LENGTH_SHORT).show();
    61. }
    62. });
    63. alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    64. alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    65. edtInput.setFocusable(true);
    66. edtInput.setFocusableInTouchMode(true);
    67. edtInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    68. @Override
    69. public void onFocusChange(View v, boolean hasFocus) {
    70. if (hasFocus) {
    71. MineInputMethodManager.showInputMethod(MineActivity.this, edtInput);
    72. } else {
    73. }
    74. }
    75. });
    76. edtInput.requestFocus();
    77. }
    78. /**
    79. * 显示软键盘(输入法)
    80. *
    81. * @param activity
    82. * @param editText
    83. */
    84. public void showInputMethod(final Activity activity, final EditText editText) {
    85. InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    86. inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    87. }
    88. /**
    89. * 隐藏软键盘(输入法)
    90. *
    91. * @param activity
    92. */
    93. public void hideInputMethod(final Activity activity) {
    94. InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    95. if (inputMethodManager.isActive() && activity.getCurrentFocus() != null) {
    96. if (activity.getCurrentFocus().getWindowToken() != null) {
    97. inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(),
    98. InputMethodManager.HIDE_NOT_ALWAYS);
    99. }
    100. }
    101. }

    4、添加自定义Dialog的layout。

    1. "1.0" encoding="utf-8"?>
    2. "http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="@dimen/dp_300"
    5. android:layout_height="@dimen/dp_240"
    6. android:background="@drawable/corners_14_color_white"
    7. android:orientation="vertical">
    8. android:layout_width="@dimen/dp_300"
    9. android:layout_height="@dimen/dp_240"
    10. android:orientation="vertical"
    11. tools:ignore="UselessParent">
    12. android:layout_width="match_parent"
    13. android:layout_height="@dimen/dp_20" />
    14. android:layout_width="match_parent"
    15. android:layout_height="@dimen/dp_40"
    16. android:layout_gravity="center_horizontal"
    17. android:gravity="center"
    18. android:paddingStart="@dimen/dp_10"
    19. android:paddingEnd="@dimen/dp_10"
    20. android:text="Decimal"
    21. android:textColor="@color/blue"
    22. android:textSize="@dimen/sp_16" />
    23. android:layout_width="match_parent"
    24. android:layout_height="@dimen/dp_20" />
    25. android:id="@+id/edt_input"
    26. android:layout_width="@dimen/dp_240"
    27. android:layout_height="@dimen/dp_40"
    28. android:layout_gravity="center_horizontal"
    29. android:background="@drawable/corners_14_color_white_stroke_1_color_80000000"
    30. android:gravity="center_vertical"
    31. android:paddingStart="@dimen/dp_15"
    32. android:paddingEnd="@dimen/dp_15"
    33. android:textColor="@color/colorBlack333"
    34. android:textSize="@dimen/sp_16" />
    35. android:layout_width="match_parent"
    36. android:layout_height="@dimen/dp_20" />
    37. android:layout_width="@dimen/dp_200"
    38. android:layout_height="@dimen/dp_40"
    39. android:layout_gravity="center_horizontal">
    40. android:id="@+id/tev_cancel"
    41. android:layout_width="@dimen/dp_80"
    42. android:layout_height="@dimen/dp_40"
    43. android:layout_gravity="start"
    44. android:background="@drawable/corners_14_color_white_stroke_1_color_80000000"
    45. android:gravity="center"
    46. android:paddingStart="@dimen/dp_10"
    47. android:paddingEnd="@dimen/dp_10"
    48. android:text="cancel"
    49. android:textColor="@color/color_80000000"
    50. android:textSize="@dimen/sp_16" />
    51. android:id="@+id/tev_confirm"
    52. android:layout_width="@dimen/dp_80"
    53. android:layout_height="@dimen/dp_40"
    54. android:layout_gravity="end"
    55. android:background="@drawable/corners_14_color_white_stroke_1_color_blue"
    56. android:gravity="center"
    57. android:paddingStart="@dimen/dp_10"
    58. android:paddingEnd="@dimen/dp_10"
    59. android:text="confirm"
    60. android:textColor="@color/blue"
    61. android:textSize="@dimen/sp_16" />
    62. </FrameLayout>
    63. LinearLayout>

    5、在res文件夹的drawable文件夹新建几个xml文件,并把一下的xml代码复制进去。

    1. corners_14_color_white的drawable文件
    2. <shape xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:shape="rectangle">
    4. <corners android:radius="@dimen/dp_14" />
    5. <solid android:color="@color/white" />
    6. shape>
    7. corners_14_color_white_stroke_1_color_80000000的drawable文件
    8. <shape xmlns:android="http://schemas.android.com/apk/res/android"
    9. android:shape="rectangle">
    10. <corners android:radius="@dimen/dp_14" />
    11. <solid android:color="@color/white" />
    12. <stroke
    13. android:width="@dimen/dp_1"
    14. android:color="@color/color_80000000" />
    15. shape>
    16. corners_14_color_white_stroke_1_color_blue的drawable文件
    17. <shape xmlns:android="http://schemas.android.com/apk/res/android"
    18. android:shape="rectangle">
    19. <corners android:radius="@dimen/dp_14" />
    20. <solid android:color="@color/white" />
    21. <stroke
    22. android:width="@dimen/dp_1"
    23. android:color="@color/blue" />
    24. shape>

    6、添加DecimalInputFilter类。

    1. package com.phone.main_module.edit_text_attribute;
    2. import android.text.InputFilter;
    3. import android.text.Spanned;
    4. /**
    5. * 小数最多xx位(这是第一步处理,第二步见DecimalTextWatcher)
    6. */
    7. public class DecimalInputFilter implements InputFilter {
    8. private static final String TAG = DecimalInputFilter.class.getSimpleName();
    9. //小数点前边几位
    10. private int beforeDecimalNum;
    11. //小数点后边几位
    12. private int afterDecimalNum;
    13. public DecimalInputFilter(int beforeDecimalNum, int afterDecimalNum) {
    14. this.beforeDecimalNum = beforeDecimalNum;
    15. this.afterDecimalNum = afterDecimalNum;
    16. }
    17. @Override
    18. public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    19. String beforeData = dest.toString();
    20. String inputData = source.toString();
    21. if (source.length() == 0 && dend > dstart) {
    22. //删除操作
    23. //使用系统的
    24. return null;
    25. } else {
    26. //输入操作
    27. if (beforeData.contains(".")) {
    28. String[] beforeDataArr = beforeData.split("\\.");
    29. if (beforeDataArr.length > 1 && beforeDataArr[0].length() >= beforeDecimalNum && beforeDataArr[1].length() >= afterDecimalNum) {
    30. //返回自定义的
    31. return "";
    32. } else if (beforeDataArr.length >= 1 && beforeDataArr[0].length() >= beforeDecimalNum && dstart <= beforeDecimalNum) {
    33. //返回自定义的
    34. return "";
    35. } else if (beforeDataArr.length > 1 && beforeDataArr[1].length() >= afterDecimalNum && dend >= beforeDecimalNum) {
    36. //返回自定义的
    37. return "";
    38. }
    39. } else {
    40. if (beforeData.length() >= beforeDecimalNum && !inputData.equals(".")) {
    41. //返回自定义的
    42. return "";
    43. }
    44. }
    45. }
    46. //使用系统的
    47. return null;
    48. }
    49. }

    7、添加DecimalTextWatcher类。

    1. package com.phone.main_module.edit_text_attribute;
    2. import android.text.Editable;
    3. import android.text.TextUtils;
    4. import android.text.TextWatcher;
    5. import android.widget.EditText;
    6. import com.phone.common_library.callback.OnCommonSingleParamCallback;
    7. /**
    8. * 小数最多xx位(这是第二步处理,第一步见DecimalInputFilter)
    9. */
    10. public class DecimalTextWatcher implements TextWatcher {
    11. private static final String TAG = DecimalTextWatcher.class.getSimpleName();
    12. private String beforeData;
    13. private String[] beforeDataArr;
    14. private EditText editText;
    15. //小数点后边几位
    16. private int afterDecimalNum;
    17. // private OnCommonSingleParamCallback onCommonSingleParamCallback;
    18. private int index;
    19. public DecimalTextWatcher(EditText editText, int afterDecimalNum) {
    20. this.editText = editText;
    21. this.afterDecimalNum = afterDecimalNum;
    22. }
    23. // public DecimalTextWatcher(EditText editText, int afterDecimalNum, OnCommonSingleParamCallback onCommonSingleParamCallback) {
    24. // this.editText = editText;
    25. // this.afterDecimalNum = afterDecimalNum;
    26. // this.onCommonSingleParamCallback = onCommonSingleParamCallback;
    27. // }
    28. @Override
    29. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    30. beforeData = s.toString();
    31. beforeDataArr = null;
    32. if (!TextUtils.isEmpty(beforeData) && beforeData.contains(".")) {
    33. beforeDataArr = beforeData.split("\\.");
    34. }
    35. index = editText.getSelectionStart();
    36. }
    37. @Override
    38. public void onTextChanged(CharSequence s, int start, int before, int count) {
    39. }
    40. @Override
    41. public void afterTextChanged(Editable s) {
    42. String afterData = s.toString();
    43. editText.removeTextChangedListener(this);
    44. if (afterData.contains(".") && afterData.length() > 1) {
    45. if (beforeDataArr != null && beforeDataArr.length > 1) {
    46. for (int i = 0; i < beforeDataArr.length; i++) {
    47. if (afterData.contains(beforeDataArr[i])) {
    48. String[] afterDataArr = afterData.split("\\.");
    49. if (afterDataArr != null && afterDataArr.length > 1 && afterDataArr[1].length() > afterDecimalNum) {
    50. if (index >= afterDataArr[0].length()) {
    51. s.delete(index, index + 1);
    52. }
    53. break;
    54. }
    55. }
    56. }
    57. }
    58. }
    59. editText.addTextChangedListener(this);
    60. // afterData = s.toString();
    61. // if (!TextUtils.isEmpty(afterData)) {
    62. // onCommonSingleParamCallback.onSuccess(afterData);
    63. // } else {
    64. // onCommonSingleParamCallback.onError("");
    65. // }
    66. }
    67. }

    8、在res文件夹的values文件夹的values.xml文件下加入dialog style。

    1. <style name="dialog_decimal_style" parent="Theme.AppCompat.Dialog">
    2. <item name="android:colorBackground">@android:color/transparentitem>
    3. style>

    如对此有疑问,请联系qq1164688204。

    推荐Android开源项目

    项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。

    项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

  • 相关阅读:
    Swin Transformer:最佳论文,准确率和性能双佳的视觉Transformer | ICCV 2021
    跳槽涨薪技术之python+pytest接口自动化(6)-请求参数格式的确定
    PWN Test_your_nc Write UP
    ABP中关于Swagger的一些配置
    [附源码]java毕业设计龙虎时代健身房管理系统
    笔记应用选择和知识管理
    Debezium发布历史163
    【生日快乐】SpringBoot SpringBoot 提高篇(第二篇) 第5章 SpringBoot 日志 5.1 日志介绍 & 5.2 日志框架
    Jenkins简介及安装配置详解:开启持续集成之旅
    [Linux] VMware虚拟机开机后直接进入memtest
  • 原文地址:https://blog.csdn.net/NakajimaFN/article/details/126018399