Событие BeforeTextChanged не возвращает текст, который должен быть введен в пользовательском обработчике ввода.

У меня есть собственный Entry Renderer в Android, и я реализовал событие BeforeTextChanged, чтобы получить текст, который будет введен, но он не возвращает этот текст.

Я реализовал двумя разными способами:

  • Сначала реализуем ITextWatcher классом, а затем переопределяем упомянутое событие (помогая этой ссылке):

    void ITextWatcher.BeforeTextChanged(ICharSequence s, int start, int count, int after)
    {
    
        var test1 = new string(s?.ToArray());
        var test2 = Control?.Text;
    
        SpannableString spannableString = new SpannableString(s);
        BackgroundColorSpan backgroundSpan = new     BackgroundColorSpan(Color.Blue);
        spannableString.SetSpan(backgroundSpan, start, start + count, 
        SpanTypes.ExclusiveExclusive);
        var test3 = spannableString;
    
    }
    
  • Второй способ:

    Control.BeforeTextChanged += (sender, args) =>
    {
    
        var test1 = new string(args?.Text.ToArray());
        var entry = sender as EditText;
        var test2 = entry?.Text;
        var test3 = Control?.Text; 
    
    };
    

Но ни один из них не вернет текст, который вот-вот будет введен. Я хочу получить доступ к этому тексту и только при некоторых обстоятельствах разрешить его вставку. Я не хочу использовать Behavior, так как он мне не подходит.


person VahidShir    schedule 28.01.2018    source источник
comment
Привет, ты решил свою проблему?   -  person Robbit    schedule 31.01.2018


Ответы (1)


Первый способ, ITextWatcher:

 class MyEntryRenderer : EntryRenderer
    {
        public MyEntryRenderer() : base()
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.SetBackgroundColor(global::Android.Graphics.Color.LightGreen);
                Control.AddTextChangedListener(new MyTextWatcher());
            }
        }
    }
    class MyTextWatcher :Java.Lang.Object, ITextWatcher
    {

        public void AfterTextChanged(IEditable s)
        {
            Android.Util.Log.Error("lv", "afterTextChanged ---->" + s);

        }

        public void BeforeTextChanged(ICharSequence s, int start, int count, int after)
        {
            Android.Util.Log.Error("lv", "beforeTextChanged ----> s=" + s + "----start=" + start
          + "----after=" + after + "----count" + count);
        }


        public void OnTextChanged(ICharSequence s, int start, int before, int count)
        {
            Android.Util.Log.Error("lv", "onTextChanged ---->s=" + s + "----start=" + start
+ "----before=" + before + "----count" + count);
        }
    }

это работает хорошо.

Второй способ, Control.BeforeTextChanged, тоже хорошо работает.

он не возвращает этот текст

Методы, которые вы указали в своем вопросе, все они хорошо работают в моем телефоне. Пожалуйста, покажите больше кодов, чтобы я мог помочь вам найти, где не так.

person Robbit    schedule 30.01.2018
comment
Это тоже не сработало. Предположим, мы хотим ввести первый символ (скажем, a) в запись, поэтому BeforeTextChanged должен вернуть a. Но он возвращает пустое значение, т.е. - person VahidShir; 31.01.2018
comment
Эй, подождите, может быть, я ошибаюсь. Можем ли мы ожидать, что BeforeTextChanged вернет тот самый текст, который будет введен??? - person VahidShir; 31.01.2018
comment
Привет, если в вашей записи есть a, и вы вводите b, BeforeTextChanged вернет a. OnTextChanged и AfterTextChanged вернут ab. Что вы имеете в виду под returns the very text? - person Robbit; 31.01.2018
comment
Я имел в виду, что предположим, что вы собираетесь ввести символ a в качестве первого символа в записи. Я хотел получить это в событии BeforeTextChanged и предотвратить его вставку в запись. Хотя я думаю, что я был неправ, и это событие не даст нам этого! - person VahidShir; 31.01.2018
comment
Да, вы правы, BeforeTextChanged не вернет a, потому что оно не принадлежит событию BeforeTextChanged. Он относится к событиям OnTextChanged и AfterTextChanged. Вам нужно сделать демо, чтобы проверить это событие. - person Robbit; 01.02.2018