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:ClassCastExceptioncustom_loadingscreenpopupscreenにも似た別のクラスを呼び出すことができます。それはうまくいきます。

また、このクラスを別のボタンで呼び出してみましたが、それでも同じ問題が発生しました。

4

1 に答える 1

5

コードを見るとCustom_LoadingScreen、キャストを行っている場所は 1 つだけです。

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

だから、それは探し始めるのに良い場所です. "BlackBerry GIFEncodedImage ClassCastException"を Google で検索すると、次のスレッドが見つかります。

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

問題は、最適化のために、BlackBerry が画像を PNG 形式に変換することを好むことです。これは、ほとんどのスマートフォンで最適に動作します。つまり、ここで起こっていることは、GIF 画像が実際に PNG 画像に変換されているということです。したがって、getEncodedImageResource()メソッドを呼び出すと、返されるオブジェクトは実際には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) は少し醜く見えます。ただし、これを行う利点は、この 1 つのイメージに対してのみこの動作を無効にできることです。ほとんどの画像が PNG 画像でない場合は、BlackBerry に他の画像を最適化させることが重要な場合があります。しかし、これは GIF である必要があるかもしれません。したがって、#2 では、これを特別なケースとして処理できます。

この画像はアニメーションGIF ではないでしょうか。そうですか?もしそうなら、おそらくそれをGIFとして保持したいので、番号(3)を実行したくないでしょう。これにより、PNGに変換され、そのように使用されます。

于 2012-07-12T04:56:19.640 に答える