【问题标题】:Casting error on android device and not on simulator在android设备上而不是在模拟器上投射错误
【发布时间】:2019-06-27 01:57:39
【问题描述】:

我从日志中看到来自 android 平板电脑的以下错误。在android中将组件转换为容器有什么问题吗?

【问题讨论】:

  • 您的代码假定容器c 的所有子项的类型为Container,但您的转换异常表明这种假设是错误的。但是,您的本机日志无助于理解您错误转换的内容,因为类名被混淆了。也许您可以在禁用 ProGuard 的情况下进行新构建,以获得更重要的日志。此外,还有一些布局(如 TextModeLayout)和组件(如 InputComponents)在 Android 和 iPhone 上的呈现方式不同:您可以使用 Android 皮肤和 iPhone 皮肤进行测试,看看是否存在差异。

标签: codenameone


【解决方案1】:

正如我在 cmets 中所写,我不知道您为什么会出现此转换错误:因为您的日志中的类名被混淆了(由 Proguard,默认情况下用于 Android),请尝试暂时禁用它以有一个更易读的日志(我指的是构建提示android.enableProguard=false)。

我的代号一代码中有很多演员表。一般来说,对于这种情况,我使用如下代码:

        Container myCnt = new Container();
        myCnt.add(new Label("Test"));
        myCnt.add(new Container());

        for (Component cmp : myCnt.getChildrenAsList(true)) {
            if (cmp instanceof Container) {
                Container myChildCnt = (Container) cmp;
                // do what I need with myChildCnt
            } else {
                Log.p("cmp is not a Container, it is: " + cmp, Log.WARNING);
            }
        }

与您的代码唯一显着的区别是用于调查转换错误的日志。在这种情况下,日志是:

[EDT] 0:0:0,76 - cmp is not a Container, it is: Label[x=0 y=0 width=0 height=0 name=null, text = Test, gap = 2]

记得在模拟器中试用Android和iPhone皮肤,看看是否有差异。

【讨论】:

  • 添加构建提示 android.enableProguard=false 后,我没有看到任何详细的错误消息。消息和以前一样。谢谢
  • 那里似乎有一个标签,答案似乎是正确的。如果它是一个无限进度容器,它可能是一个标签。可能是别的东西,但这很难猜。
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多