Как ограничить длину EditText 6 целыми числами и 3 десятичными знаками в C# (MonoDroid)? - PullRequest
0 голосов
/ 29 марта 2020

Здравствуйте, я новичок здесь, не будь таким сложным, я создаю проект в Xamarin.Andriod, используя c #.

Я пытаюсь выполнить проверку EditText в Xamarin. Android (C # / MonoDroid).

Я должен выполнить следующее условие: «Это позволяет вводить 6 целых и 3 десятичных знака в диапазон от 0 до 999999,999 '

Я нашел несколько возможных решений в java (я не знаю много, и я не смог реализовать их в C #), и они следующие:

TextWatcher с Java

InputFilter с Java

Я не знаю, как его применить в C #, если кто-то может объяснить или дать мне простой пример, но в C #.

это мой EditText:

                    ```<EditText
                        android:id="@+id/etVolume"
                        android:layout_width="@dimen/value_zero"
                        android:hint="Volumen"
                        android:textColor="@color/grisPrimario"
                        android:layout_height="fill_parent"
                        android:layout_weight="5"
                        android:textSize="@dimen/fluidListItem_text_size"
                        android:inputType="numberDecimal"
                        android:maxLength ="9"
                        android:textColorHint="@android:color/darker_gray"
                        android:backgroundTint="@color/grisPrimario"
                        android:gravity="bottom"
                        android:layout_marginBottom="-3dp"
                        android:layout_marginRight="@dimen/fluidListItemMarginRight"/>```

и мой фрагмент определен как этот EditText как это:

Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);

etVolume.setFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(6,3)});

но я не понимаю, как реализовать метод.

Я видел это с java они используют "TextW atcher "и" InputFilter ", но я не понимаю, как изменить его на C#

Я ценю любую помощь, которую я потратил на это несколько дней.

Большое спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Позволяет ввести 6 целых и 3 десятичных знака в диапазоне от 0 до 999999,999 '

Я создаю IInputFilter, на который вы можете посмотреть:

 public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
{
    private double _min = 0;
    private double _max = 0;

    public DecimalDigitsInputFilter(double min, double max)
    {
        _min = min;
        _max = max;
    }

    public ICharSequence FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
    {
        try
        {
            string val = dest.ToString().Insert(dstart, source.ToString());
            if (val.Contains("."))
            {
                string[] array = val.Split(".");
                string value1 = array[0].ToString();
                string value2 = array[1].ToString();

                if (value1.Length > 6|| value1=="")
                {                      
                }
                else
                {
                    if(value2!="" && value2.Length<=3)
                    {
                        double input = double.Parse(val);
                        if (IsInRange(_min, _max, input))
                            return null;

                    }
                    else if(value2=="")
                    {
                        if(IsInRange(_min,_max,double.Parse(value1)))
                        {
                            return null;
                        }
                    }                      
                }
            }
            else
            {
               if(val.Length<=6)
                {
                    double input = double.Parse(val);
                    if (IsInRange(_min, _max, input))
                        return null;
                }                                   
            }                 

        }
        catch (System.Exception ex)
        {
            Console.WriteLine("FilterFormatted Error: " + ex.Message);
        }

        return new Java.Lang.String(string.Empty);


    }
    private bool IsInRange(double min, double max, double input)
    {
        return max > min ? input >= min && input <= max : input >= max && input <= min;
    }
}

 edittext1 = FindViewById<EditText>(Resource.Id.editText1);
 edittext1.SetFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(0,999999.999) });
0 голосов
/ 31 марта 2020

Он решает это следующим образом, используя InputFilter:

Во фрагменте:

public EditText Volume;
Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);
Volume.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(6, 3) });
public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
    {
        string regexStr = string.Empty;

        public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero)
        {
            regexStr = "^[0-9]{0," + (digitsBeforeZero) + "}([.][0-9]{0," + (digitsAfterZero - 1) + "})?$";
        }

        public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
        {
            Regex regex = new Regex(regexStr);

            if (regex.IsMatch(dest.ToString()) || dest.ToString().Equals(""))
            {
                if (dest.ToString().Length < 6 && source.ToString() != ".")
                {
                    return new Java.Lang.String(source.ToString());
                }
                else if (source.ToString() == ".")
                {
                    return new Java.Lang.String(source.ToString());
                }
                else if (dest.ToString().Length >= 7 && dest.ToString().Length <= 10)
                {
                    return new Java.Lang.String(source.ToString());
                }
                else
                {
                    return new Java.Lang.String(string.Empty);

                }
            }

            return new Java.Lang.String(string.Empty);
        }
    }

В A XML

                        <EditText
                            android:id="@+id/etVolume"
                            android:layout_width="@dimen/value_zero"
                            android:hint="Volumen"
                            android:textColor="@color/grisPrimario"
                            android:layout_height="fill_parent"
                            android:layout_weight="5"
                            android:textSize="@dimen/fluidListItem_text_size"
                            android:inputType="numberDecimal"
                            android:maxLength ="10"
                            android:textColorHint="@android:color/darker_gray"
                            android:backgroundTint="@color/grisPrimario"
                            android:gravity="bottom"
                            android:layout_marginBottom="-3dp"
                            android:layout_marginRight="@dimen/fluidListItemMarginRight"/>

Этот ответ можно улучшить, а фильтры удалить, изменив и собрав ReGex лучше.

он работает полностью. не позволяет вводить больше значений после ввода 6 десятичных знаков, условие позволяет вводить только точку (.) и затем 3 десятичных знака.

Я думаю, что это может быть чище, если вы создадите лучший RegEx.

пересмотр У меня осталось условие, что для изменения целых чисел необходимо удалить все значение.

Если у вас есть более четкий ответ, я надеюсь увидеть его для его реализации.

0 голосов
/ 29 марта 2020

Лучше сделать это в коде, добавив функцию для проверки внутри TextWatcher. Так как он будет вызываться всякий раз, когда пользователь что-то набирает.

В этой функции вы можете проверить свое состояние и отобразить сообщение об ошибке, если условие не удовлетворяет.

editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

    // call checkNumber() function here

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    // TODO Auto-generated method stub
}

@Override
public void afterTextChanged(Editable s) {

    // TODO Auto-generated method stub
}
});

В C#

public class TextWatcher : Java.Lang.Object, ITextWatcher
{
public void AfterTextChanged(IEditable s)
{
    //
}

public void BeforeTextChanged(ICharSequence s, int start, int count, int after)
{
    //
}

public void OnTextChanged(ICharSequence s, int start, int before, int count)
{
    //
}

}

Добавьте слушателя к вашему EditText

editText.AddTextChangedListener(new TextWatcher());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...