1

我正在调用这个类PopupScreen

public class Custom_LoadingScreen extends PopupScreen {
private VerticalFieldManager vfm;
private Util_AnimateGifField anmtFldCycle = null;
private GIFEncodedImage gifImgCycle;

public Custom_LoadingScreen() {
    super(new VerticalFieldManager());
    Background bg = BackgroundFactory.createSolidTransparentBackground(
            Color.BLACK, 190);
    setBackground(bg);
    setBorder(BorderFactory.createSimpleBorder(new XYEdges(),
            Border.STYLE_TRANSPARENT));

    gifImgCycle = (GIFEncodedImage) GIFEncodedImage
            .getEncodedImageResource("LoadingSpinner.gif");
    anmtFldCycle = new Util_AnimateGifField(gifImgCycle,
            Field.FIELD_HCENTER);

    vfm = new VerticalFieldManager(USE_ALL_WIDTH) {
        protected void sublayout(int maxWidth, int maxHeight) {
            super.sublayout(Display.getWidth(), Display.getHeight());
            setExtent(Display.getWidth(), Display.getHeight());
        }
    };
    int padding = (Display.getHeight() - 16) / 2;
    if (padding > 0) {
        anmtFldCycle.setPadding(padding, 0, 0, 0);
    }
    vfm.add(anmtFldCycle);
    add(vfm);
}

//public void Popupscreen() {
    //Main.getUiApplication().popScreen(this);
//}

public boolean keyDown(int keycode, int status) {
    if (Keypad.key(keycode) == Keypad.KEY_ESCAPE) {
        Main.getUiApplication().popScreen(this);
        return true;
    }
    return super.keyDown(keycode, status);
}
}

在一个按钮中,我在进入下一个屏幕之前按下它。

financebtn = new Custom_ButtonField(finance, financeactive,
            financeactive) {
        protected boolean navigationClick(int status, int time) {
            Main.getUiApplication().pushScreen(new Custom_LoadingScreen());
            Main.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                //  Main.getUiApplication().popScreen();
                    Main.getUiApplication().pushScreen(
                            new Main_NewsDetail());
                }

            }, 1 * 1000, false);

            return true;
        }
    };
    add(financebtn);

结果给我Uncaught:ClassCastException。我可以调用另一个类似于custom_loadingscreenpopupscreen 的类。它工作正常。

我也尝试在另一个按钮中调用这个类,但仍然是同样的问题。

4

1 回答 1

5

如果你看一下你的Custom_LoadingScreen代码,你只有一个地方在做演员:

gifImgCycle = (GIFEncodedImage) GIFEncodedImage
        .getEncodedImageResource("LoadingSpinner.gif");

所以,这是一个开始寻找的好地方。如果你用谷歌搜索“BlackBerry GIFEncodedImage ClassCastException”,你会发现这个线程:

http://supportforums.blackberry.com/t5/Java-Development/GIFEncodedImage-in-BlackBerry-OS7/td-p/1228959

问题在于,为了优化,黑莓喜欢将图像转换为大多数智能手机最适合的 PNG 格式。所以,这里发生的事情是您的 GIF 图像实际上正在转换为 PNG 图像。因此,当您调用该getEncodedImageResource()方法时,您返回的对象实际上可能是 type PNGEncodedImage,而不是GIFEncodedImage,并且您会收到异常。偷偷摸摸的吧?

您可以通过几种方式解决它。

  1. Blackberry_App_Descriptor.xml文件中,您可以取消选中指定将图像转换为 PNG 的设置(构建选项卡 ->将图像文件转换为 png
  2. 您可以通过将 GIF 文件重命名为LoadingSpinner.agif之类的名称来欺骗构建系统。该工具集无法识别 .agif 扩展名,因此不会尝试对其进行转换。当然,如果你这样做了,请记住在加载 Java 代码时也要更改文件名。
  3. 您可以更改要使用的代码PNGEncodedImage,或像这样测试对象:
EncodedImage img = EncodedImage.getEncodedImageResource("LoadingSpinner.gif");
if (img instanceof GIFEncodedImage) {
   // cast to GIFEncodedImage
} else if (img instanceof PNGEncodedImage) {
   // cast to PNGEncodedImage
}

数字 (1) 将失去所有非 PNG 图像的非 PNG 到 PNG 转换优化,而不仅仅是这个。

数字 (2) 看起来确实有点难看。但是,这样做的好处是您可以仅对这一个图像禁用此行为。如果您的大多数图像不是 PNG 图像,让 BlackBerry 为您优化其他图像可能会很有价值。但是,也许这个需要是 GIF。因此,#2 让您将其作为一种特殊情况处理。

我只是猜测这张图片可能是动画GIF?是对的吗?如果是这样,您可能希望将其保留为 GIF,因此您不想执行数字 (3),它可以将其转换为 PNG 并按原样使用。

于 2012-07-12T04:56:19.640 回答