-1

私は無知に見えるかもしれませんが、BlackBerry アプリケーションの開発に関する問題を解決する方法についての情報はあまり見つかりませんでした。

基本的に、いくつかの画像ボタンを含む UI を作成しました。私がやりたいのは、ボタンの1つをクリックすると、画面の中央にある画像がシームレスに別の画像に切り替わることです。

私は現在、スレッドを使用していませんが、収集したものから必要ですか?

それとも、ボタン リスナーで新しい画面をプッシュし、クラスのコンストラクターを呼び出して、別の画像でページを再構築する必要がありますか?

これが不明確な場合は申し訳ありませんが、これを行う方法に関する基本的な情報、またはブラックベリーのページ更新を詳細に説明するリンクをいただければ幸いです!

どうもありがとう

編集:さて、ここに私のコードの非常に小さな部分があります:

これは基本的に、リスナーで最後に試したことです。2 つのボタンのいずれかを押したときに画像 (flagField) を変更する方法がわかりません。私にとってうまくいったのは pushScreen(new Csps("americanflag")); だけでした。ボタンを押すたびに、パフォーマンスが悪く、理想的ではない画面のスタックが残っていました.

私は一日中これをやろうとしてきました... ため息、ここに行きます:

public class CSP extends UiApplication 
{
public static void main(String[] args)
{
    CSP theApp = new CSP(); 
    theApp.enterEventDispatcher(); 
}

public CSP() 
{ 
    CSPS csps = new CSPS();
    pushScreen(csps); 
} 
}

class CSPS extends MainScreen implements FieldChangeListener
{

int width = Display.getWidth();
int height = Display.getHeight();

ButtonField backButton;

ImageButtonField canadianFlag;
ImageButtonField americanFlag;
Bitmap changeableFlag;
String currentFlag ="canada_flag.png";
BitmapField flagField;

canadianFlag = construct("canada_flag.png", 0.18);
americanFlag = construct("us.gif", 0.18);

    canadianFlag.setChangeListener(this);
    americanFlag.setChangeListener(this);

    add(flagField);
    add(canadianFlag);
    add(americanFlag);
//LISTENERS
public void fieldChanged(Field field, int context){


    if(field == canadianFlag){
        setCurrentFlagResource("canada_flag.png");
        BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
        replace(flagField, newFlagField);

        this.invalidate();
        this.doPaint();
        this.updateDisplay();

    }
    else if(field == americanFlag){

        setCurrentFlagResource("american-flag.gif");
        BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
        replace(flagField, newFlagField);

        this.invalidate();
        this.doPaint();
        this.updateDisplay();

    }

setCurrentFlagRessource メソッドは、flagField 属性を適切な BitmapField に設定します。

4

3 に答える 3

2

で呼ばれるメソッドがありsetBitmap()ますBitmapField

リスナーでは、単に を呼び出す必要がありますflagField.setBitmap(newbitmap)。メソッドを使用することもできますsetImage()invalidate()、 updateUI などを呼び出す必要はありません。

このメソッドの使用中に何かが発生した場合IllegalStateExceptionは、Applicaton Event ロック オブジェクトでロックを取得するか、このコードをinvokeLater()してください。

于 2012-02-12T05:16:13.940 に答える
1

ブロックする可能性のある場所 (Web サーバーなど) から画像を取得する場合にのみ、スレッドを使用する必要があります。ボタンまたは画面で invalidate() を呼び出す必要があるかもしれませんが、画像を更新するだけでよいはずです。本当に役立つのは、あなたが何をしているかについての情報です。画像を表示するために使用しているクラス、拡張したかどうかなどについても教えてくれませんでした。

于 2012-02-10T19:25:50.310 に答える
0

コードで何をしているのかわかりません。しかし、画面を更新する方法はそうではありません。

だから、私はあなたが画面を更新しようとしているあなたのCSPS画面を変更します。以下のコードを参照してください...

class CSPS extends MainScreen implements FieldChangeListener
{

int width = Display.getWidth();
int height = Display.getHeight();

ButtonField backButton;

//ImageButtonField canadianFlag;
//ImageButtonField americanFlag;
Bitmap changeableFlag;
String currentFlag ="canada_flag.png";
BitmapField flagField;
public CSPS() 
{
    createGUI();
}       

public void createGUI() 
{
    canadianFlag = construct("canada_flag.png", 0.18);
    americanFlag = construct("us.gif", 0.18);

        canadianFlag.setChangeListener(this);
        americanFlag.setChangeListener(this);

        add(flagField);
        add(canadianFlag);
        add(americanFlag);
    //LISTENERS
}

public void fieldChanged(Field field, int context){


    if(field == canadianFlag)
    {
        setCurrentFlagResource("canada_flag.png");
        BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
        replace(flagField, newFlagField);

        deleteAll();
        createGUI();
        invalidate();
    }
    else if(field == americanFlag)
    {
        setCurrentFlagResource("american-flag.gif");
        BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
        replace(flagField, newFlagField);

        deleteAll();
        createGUI();
        invalidate();   
    }
}
}
  1. createGUI ()メソッドを作成し、その画面用に設計する必要があるコードを記述します。この画面だけではありません。あなたが作成しているものは、このようにします。と
deleteAll();
createGUI();
invalidate();
  1. 画面を更新するには、上記の 3 行を実行します。すべてのフィールドを削除し、createGUI()メソッドを再度呼び出します。そして最後にinvalidate();
于 2012-02-11T05:34:36.477 に答える