0

В моем проекте формы xamarin у меня есть экран со списком, содержащим количество элементов ввода и других элементов управления. Для ввода я определил функциональность для событий text_changed, focus и unocus. и запись имеет десятичную клавиатуру (принимает только десятичную).

Выпуск: Когда я пытаюсь ввести номер, ожидаемое поведение должно запускать text_changed, но оно запускает событие нефокусировки и фокусировки также два раза.
[Введите текст-> text_changed-> unocus-> focus-> unocus-> focus]. Из-за этого вся моя логика, написанная в соответствующих событиях, перетасовывается и показывает странное поведение.
И этот работает как ожидается в iOS, показывая эту проблему только в Android.
Код:Ввод управления фокус нефокус событие запускается случайно внутри списка в форме xamarin

<DataTemplate x:Key="Numeric"> 
     <ViewCell> 
      <ViewCell.View> 
      <StackLayout Padding="0"> 
       <StackLayout Spacing="0" Padding="10"> 
       <Grid ColumnSpacing="0" Padding="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> 
        <Grid.RowDefinitions> 
        <RowDefinition Height="auto" /> 
        <RowDefinition Height="auto" /> 
        <RowDefinition Height="auto" /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <controls:CustomLabel Text="{Binding .Question}" Style="{StaticResource ListItemInspectionLabelStyleWordwrap}" HorizontalOptions="Start" VerticalOptions="Start" Grid.Row="0" Grid.Column="0" /> 
        <controls:CustomEntry x:Name="InputEntry" IsEnabled="{Binding .CanRespond}" FontSize="12" TextChanged="OnNumericTextChanged" HeightRequest="50" Keyboard="Numeric" Focused="OnNumericFocus" Unfocused="OnNumericUnFocus" HorizontalOptions="FillAndExpand" VerticalOptions="End" 
         ClassId="{Binding .QuestionId}" Grid.Row="1" Grid.Column="0" /> 
        <controls:ExtendedLabel x:Name="NumberHint" TextColor="#71797B" LineBreakMode="NoWrap" Text="{Binding NumericFieldTitle}" Style="{StaticResource ListItemInspectionLabelStyleWordwrap}" 
         HorizontalOptions="Start" VerticalOptions="Start" Grid.Row="2" Grid.Column="0" /> 
       </Grid> 
       </StackLayout> 
       <BoxView Style="{StaticResource ListDividerStyle}" /> 
      </StackLayout> 
      </ViewCell.View> 
     </ViewCell> 
     </DataTemplate> 

Для Входа я написал визуализатор для некоторого выравнивания:

[assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))] 
namespace Inspect.Droid 
{ 
    public class CustomEntryRenderer : EntryRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
     { 
      base.OnElementChanged(e); 

      if (e.OldElement == null) 
      { 
       Control.SetBackgroundColor(global::Android.Graphics.Color.Rgb(230, 230, 230)); 
       Control.SetTextColor(global::Android.Graphics.Color.Black); 

       var nativeEditText = (global::Android.Widget.EditText)Control; 
       nativeEditText.SetTextColor(Android.Graphics.Color.Black); 
       nativeEditText.SetBackgroundResource(Resource.Drawable.inspection_editor_background); 
       nativeEditText.SetPadding(30, 0, 0, 0); 
       nativeEditText.Gravity = Android.Views.GravityFlags.CenterVertical; 
      } 
     } 
     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      base.OnElementPropertyChanged(sender, e); 

      var nativeEditText = (global::Android.Widget.EditText)Control; 
      nativeEditText.SetPadding(30, 0, 0, 0); 
      nativeEditText.Gravity = Android.Views.GravityFlags.CenterVertical; 
     } 
    } 
} 

Даже я видел несколько сообщений, указавших на тот же вопрос, но не получил каких-либо решений/Работа обходные , Тот же вопрос, как сообщается в xamarin bugzilla и Selecting Entry Controls Within ViewCells Causes FocusChange Cycle и в других link

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

ответ

3

Я повторно рассмотрел ошибку цикла фокусировки, которую вы упомянули путем тестирования с помощью форм 2.3.3.180, и из того, что я вижу, цикл фокусировки исходит от OnLayout() being fired on the ListView. Я не уверен, почему это называется, но я чувствую, что это может иметь отношение к появлению клавиатуры.

Но даже если он вызывается, положение и размер не изменяются, и это также поддерживается параметром changed, установленным на значение false. Итак, что вы можете сделать, это создать собственный визуализатор ListView и переопределить OnLayout(), чтобы не вызвать базу, если changed == false.

Я попробовал это на примере проекта из отчета об ошибке и, похоже, решил проблему. Однако, как отказ от ответственности, я скажу, что я не тестировал его широко и учитывая, что образец проекта прост, в этом случае могут возникнуть другие проблемы, возникающие в вашем приложении.

[assembly: ExportRenderer(typeof(EntryListView), typeof(EntryListViewRenderer))] 
namespace ListViewCheck.Droid 
{ 
    public class EntryListViewRenderer: ListViewRenderer 
    { 
     protected override void OnLayout(bool changed, int l, int t, int r, int b) 
     { 
      if (changed) 
       base.OnLayout(changed, l, t, r, b); 
     } 
    } 
} 
+0

Отлично !!! Теперь это работает как шарм. – Suchith

+0

Я попробовал это, и теперь мой список просто не отображается вообще. OnLayout вызывается 3 раза, при этом true/false/false – Julien

+0

обновляется до следующего комментария: нажатие на экран вызывает прохождение макета по любой причине и только затем отображает список. на данный момент проблема исправлена, но я не могу ожидать, что люди коснутся экрана, чтобы отобразить пользовательский интерфейс – Julien

0

добавить эту строку ----> "var baseEntry = Element as Entry;" после этого «base.OnElementChanged (e)»;

и получить фокус ввода, добавив эту строку -> "baseEntry.Focus();" внутри "if (e.OldElement == null)"

+0

Я могу сосредоточиться на записи, но при вводе числа, нефокус, события фокусировки будут вызываться дважды, каждый раз. – Suchith

Смежные вопросы