Android 设置 EditText 数字输入范围

在 Android 开发中,经常会遇到需要限制用户输入的需求。其中之一就是限制用户在 EditText 中输入的数字范围。本文将介绍如何使用代码设置 EditText 的数字输入范围,并提供相应的代码示例。

1. 了解 EditText

首先,我们需要了解 EditText 控件。EditText 是 Android 中常用的文本输入控件,用于接收用户的输入。用户可以在 EditText 中输入任意类型的文本,包括数字、字母和特殊字符等。

2. 设置数字输入范围

为了限制用户在 EditText 中输入的数字范围,我们可以使用 InputFilter。InputFilter 是一个接口,它定义了对用户输入的过滤规则。我们可以自定义一个 InputFilter,然后将其应用到 EditText 中。

下面是一个示例代码,演示如何设置 EditText 的数字输入范围为 0 到 100:

// 创建一个自定义的 InputFilter
class NumberRangeInputFilter implements InputFilter {
    private int min;
    private int max;

    public NumberRangeInputFilter(int min, int max) {
        this.min = min;
        this.max = max;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        try {
            // 获取输入的文本
            String input = dest.subSequence(0, dstart) + source.toString() + dest.subSequence(dend, dest.length());

            // 将输入的文本转换为数字
            int value = Integer.parseInt(input);

            // 判断数字是否在范围内
            if (value >= min && value <= max) {
                return null;  // 接受输入的文本
            }
        } catch (NumberFormatException e) {
            // ignore
        }

        return "";  // 拒绝输入的文本
    }
}

// 将自定义的 InputFilter 应用到 EditText
EditText editText = findViewById(R.id.editText);
editText.setFilters(new InputFilter[] { new NumberRangeInputFilter(0, 100) });

在上面的代码中,我们首先创建了一个自定义的 InputFilter,命名为 NumberRangeInputFilter。这个 InputFilter 的构造函数传入了最小值 min 和最大值 max。然后,在 filter 方法中,我们获取用户输入的文本,将其转换为数字,并判断数字是否在范围内。如果在范围内,就返回 null,表示接受输入的文本;否则,返回空字符串,表示拒绝输入的文本。

最后,我们将自定义的 InputFilter 应用到 EditText 中,通过调用 setFilters 方法设置一个 InputFilter 数组。

3. 完整示例

下面是一个完整的示例,演示如何设置 EditText 的数字输入范围为 0 到 100,并显示输入范围的饼状图。

import android.graphics.Color;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private EditText editText;
    private PieChart pieChart;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.editText);
        pieChart = findViewById(R.id.pieChart);

        // 设置 EditText 的数字输入范围为 0 到 100
        editText.setFilters(new InputFilter[] { new NumberRangeInputFilter(0, 100) });

        // 设置饼状图的数据
        List<Entry> entries = new ArrayList<>();
        entries.add(new Entry(0, 60));
        entries.add(new Entry(1, 40));

        PieDataSet dataSet = new PieDataSet(entries, "Number Range");
        dataSet.setColors(ColorTemplate.MATERIAL_COLORS);
        dataSet.setValueTextSize(12f);

        PieData data = new PieData(dataSet);

        pieChart.setData(data);
        pieChart.getDescription().setEnabled(false);
        pieChart.animateY(1000);
        pieChart.invalidate();
    }

    // 创建一个自定义的 InputFilter
    class NumberRangeInputFilter implements InputFilter {
        private int min;
        private int max;

        public NumberRangeInputFilter(int min