【问题标题】:Xamarin.Forms Android - Clicking on dynamically Created Entry throws Exception in AndroidRuntimeXamarin.Forms Android - 单击动态创建的条目会在 AndroidRuntime 中引发异常
【发布时间】:2021-03-11 08:33:47
【问题描述】:

我正在尝试做的事情的描述
我的 ContentPage 上有一个 Stacklayout。用户有一个添加按钮。通过单击此按钮,我的代码正在生成一个新网格,其中包含一个按钮以再次删除此网格、3 个条目和一个编辑器。此 Grid 已添加到 Stacklayouts Children。

到目前为止一切顺利。网格被添加到 Stacklayout。但是,当我单击 Android 条目时,我得到一个 Java.Lang.StringIndexOutOfBoundsException,我无法调试。

在 UWP 上运行良好。我不知道为什么它不能在 Android 上运行。令人沮丧的是,有时我可以单击条目但什么也没有发生,但另一次应用程序崩溃并显示异常

XAML 被截断

<Button Text="Add Newx:Name="AddNew" Clicked="AddNewButton_Clicked"/>
<StackLayout x:Name="MaterialStack" VerticalOptions="Start" HorizontalOptions="Center" IsVisible="true" Spacing="15"/>



网格是如何生成的

 public Grid CreateMaterialGrid()
    {
        
        Grid result = new Grid();            

        result.RowDefinitions.Add(new RowDefinition());
        result.RowDefinitions.Add(new RowDefinition());
        result.RowDefinitions.Add(new RowDefinition());
        result.RowDefinitions.Add(new RowDefinition());

        ColumnDefinition c1 = new ColumnDefinition
        {
            Width = new GridLength(0.5, GridUnitType.Star)
        };

        result.ColumnDefinitions.Add(c1);
        result.ColumnDefinitions.Add(new ColumnDefinition());

        Button deleteThisGridButton = new Button
        {
            Text = "Delete"
        };



        Entry materialEntry = new Entry
        {
            Placeholder = "Material"
        };          

        Entry fuhrenEntry = new Entry
        {
            Placeholder = "Fuhren",
            Keyboard = Keyboard.Numeric
        };
        
        Entry tonnenEntry = new Entry
        {
            Placeholder = "Tonnen"
        };
     
     
        Editor lieferscheinNummernEditor = new Editor();
        lieferscheinNummernEditor.Placeholder = "Lieferscheinnummern";
        

        result.Children.Add(deleteThisGridButton, 0,0);
        result.Children.Add(materialEntry, 0, 1);
        result.Children.Add(fuhrenEntry, 0, 2);
        result.Children.Add(tonnenEntry, 0, 3);
        result.Children.Add(lieferscheinNummernEditor, 1, 1);

        Grid.SetRowSpan(lieferscheinNummernEditor, 3);
        Grid.SetColumnSpan(deleteThisGridButton, 2);
                    

        return result;

    }

点击条目时出现异常

[AndroidRuntime] java.lang.StringIndexOutOfBoundsException: length=19; index=20
[AndroidRuntime]    at java.lang.String.substring(String.java:2060)
[AndroidRuntime]    at java.lang.String.subSequence(String.java:2107)
[AndroidRuntime]    at android.widget.TextView.onProvideStructure(TextView.java:12712)
[AndroidRuntime]    at android.view.View.onProvideAutofillStructure(View.java:9211)
[AndroidRuntime]    at android.view.View.dispatchProvideStructure(View.java:10092)
[AndroidRuntime]    at android.view.View.dispatchProvideAutofillStructure(View.java:10085)
[AndroidRuntime]    at android.view.ViewGroup.dispatchProvideAutofillStructure(ViewGroup.java:4424)
[AndroidRuntime]    at android.view.ViewGroup.dispatchProvideAutofillStructure(ViewGroup.java:4424)
[AndroidRuntime]    at android.app.assist.AssistStructure$WindowNode.<init>(AssistStructure.java:527)
[AndroidRuntime]    at android.app.assist.AssistStructure.<init>(AssistStructure.java:2154)
[AndroidRuntime]    at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3814)
[AndroidRuntime]    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2164)
[AndroidRuntime]    at android.os.Handler.dispatchMessage(Handler.java:107)
[AndroidRuntime]    at android.os.Looper.loop(Looper.java:237)
[AndroidRuntime]    at android.app.ActivityThread.main(ActivityThread.java:7948)
[AndroidRuntime]    at java.lang.reflect.Method.invoke(Native Method)
[AndroidRuntime]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
[AndroidRuntime]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
**Java.Lang.StringIndexOutOfBoundsException:** 'length=19; index=20'

我的尝试
我尝试本地化问题,发现它发生在条目的焦点事件完成后。
我尝试删除条目以检查其中一个是否存在问题。
我尝试删除 EventListeners 以检查如果问题发生在其中之一。

但是没有任何效果。错误总是完全相同
Java.Lang.StringIndexOutOfBoundsException:'length=19; index=20'
长度和索引也总是相同。

如何解决单击条目时应用程序崩溃的问题?

我在 StackTrace 中查看了这个错误

at android.view.View.onProvideAutofillStructure


显然,自动填充功能存在问题(至少在三星手机上)。我将它从三星通行证切换到无。之后我的应用程序不再有问题。有没有办法为我的应用关闭自动填充? (使条目不使用此功能)

【问题讨论】:

  • 首先关注您的测试步骤。你可以点击添加和删除一个GridView,也不例外?但是单击条目时会发生崩溃?任何一个条目都会崩溃,还是某个特定的?编辑呢?尝试删除所有的 E_TextChanged 或 FocusedEntry 事件绑定并测试?
  • @Shaw 感谢您的回复。是的,我这样做了。我可以毫无问题地添加和删除网格视图。它发生在每个条目以及编辑器上。就像我说的,不是一直,而是大部分时间。我还删除了所有听众进行测试。还是一样的错误
  • 您的 FocusedEntry 方法代码丢失?我找到了 Mr.19,这是你的 lieferscheinNummernEditor.Placeholder = "Lieferscheinnummern";,当你处理这个占位符时可能会发生异常
  • 为简单起见,您也可以尝试添加 StackLayout 而不是 GridView 并仅向其添加编辑器(以消除 GridView 的噪音),保留侦听器并测试。
  • 当我找到 Lieferscheinnummern 时,我也有同样的感觉。但我改变了长度并将其删除。没有任何效果,同样的索引号仍然是同样的错误。 FocusedEntry 方法只是一个虚拟方法,所以我可以有一个断点。那里什么也没有发生。我想知道这到底是什么时候发生的。我现在要用 StackLayout 试试这个想法。再次感谢

标签: c# android xamarin xamarin.forms


【解决方案1】:

看来问题出在三星的自动填充服务上。关闭后异常不再发生

要关闭它,请转到设置 --> 常规管理 --> 语言和输入 --> 自动填充服务 --> 自动填充服务 --> 关闭

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 2019-12-16
    • 2016-11-22
    • 2012-02-02
    • 2014-09-07
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多