1

Blackberry の水平および垂直フィールド マネージャーに問題があります。私のサンプル アプリケーションでは、1 つの水平フィールド マネージャーに 2 つの垂直フィールド マネージャーが追加されており、GUI は次の図のとおりです。

GUI画面

ボタンのフィールド変更リスナーで左の VFM を削除すると、ホーム ボタンのみが表示され、ホーム ボタン リスナーで左の VFM を追加すると、上の画面に戻ります。

この問題は、左のコンテンツをスクロールして左の VFM を削除した後に発生しています。その後、ホーム ボタンのみが表示され、トラック パッドのナビゲーション (スクロール) によって Null Pointer の例外画面が表示されます。次の図には、エラーのシミュレーターのスクリーン ショットが含まれています。

エラー画面

エラーを再現するための完全なソース コードを次に示します。

public class MyApp extends UiApplication{
    public static void main(String[] args)
    {
        // Create a new instance of the application and make the currently
        // running thread the application's event dispatch thread.
        MyApp theApp = new MyApp();       
        theApp.enterEventDispatcher();
    }

    /**
     * Creates a new MyApp object
     */
    public MyApp()
    {        
        // Push a screen onto the UI stack for rendering.
        pushScreen(new MyScreen());
    }
}

public final class MyScreen extends MainScreen{

    private HorizontalFieldManager hfmMainManager = null;
    
    private VerticalFieldManager menuButtonManager = null;
    
    private String[] buttons = new String[]{"BUTTON ID 1",
            "BUTTON ID 2",
            "BUTTON ID 3",
            "BUTTON ID 4",
            "BUTTON ID 5",
            "BUTTON ID 6",
            "BUTTON ID 7",
            "BUTTON ID 8",
            "BUTTON ID 9",
            "BUTTON ID 10"};
    
    private boolean menuShowing = false;
    
    /**
     * Creates a new MyScreen object
     */
    public MyScreen()
    {        
        super( Manager.NO_VERTICAL_SCROLL | MainScreen.NO_VERTICAL_SCROLLBAR
                | Manager.NO_HORIZONTAL_SCROLL | Manager.NO_HORIZONTAL_SCROLLBAR);
        
        hfmMainManager = new HorizontalFieldManager(Manager.NO_HORIZONTAL_SCROLL
                | Manager.NO_HORIZONTAL_SCROLLBAR);
        
        ////////////////////MENU BUTTONS
        menuButtonManager = new VerticalFieldManager(Manager.NO_VERTICAL_SCROLL | Manager.NO_VERTICAL_SCROLLBAR);
        
        menuButtonManager.add(new ButtonField("Header Button", Field.FIELD_HCENTER));
        VerticalFieldManager vfmScrollable = new VerticalFieldManager(Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR);
        for (int i = 0; i < buttons.length; i++) {
            
            ButtonField buttonField = new ButtonField(buttons[i], Field.FIELD_HCENTER);
            buttonField.setChangeListener(listenerButton);
            vfmScrollable.add(buttonField);
        }
        menuButtonManager.add(vfmScrollable);
        
        hfmMainManager.add(menuButtonManager);
        
        
        VerticalFieldManager vfmMenuContentManager = new VerticalFieldManager(Manager.NO_VERTICAL_SCROLLBAR | Manager.NO_VERTICAL_SCROLL);
        

        ButtonField buttonField = new ButtonField("Home Button", Field.FIELD_HCENTER);
        buttonField.setChangeListener(listenerButton);
        buttonField.setMargin(10, 0, 10, 0);
        vfmMenuContentManager.add(buttonField);
        
        hfmMainManager.add(vfmMenuContentManager);
        
        add(hfmMainManager);
        
        menuShowing = true;
    }


    private FieldChangeListener listenerButton = new FieldChangeListener() {

        public void fieldChanged(Field arg0, int arg1) {
            
            synchronized (UiApplication.getEventLock()) {
                if(menuShowing){
                    menuShowing = false;
                    hfmMainManager.delete(menuButtonManager);
                }else{
                    menuShowing = true;
                    hfmMainManager.insert(menuButtonManager, 0);    
                }
            }
        }
    };
}

この問題を解決するにはどうすればよいですか?

前もって感謝します

よろしく

アニッシュ

4

1 に答える 1

0

フォーカスイベントまたはフォーカス解除イベントからフィールド構造を変更しようとすると、同様の動作が見られます。フォーカスイベントの途中でフィールドが画面から削除されると、フォーカストラッキングが同期しなくなり、このような異常なエラーが発生する可能性があります。代わりに、UIロックの取得からinvokeLaterの呼び出しに変更してみてください。これにより、VFMを削除する前に変更リスナーの実行を終了し、すべての不変条件をそのまま維持できます。

これを取り除く:

synchronized (UiApplication.getEventLock()) {

これに置き換えます:

UiApplication.getInstance().invokeLater(new Runnable{ public void run() {
于 2013-02-11T20:44:00.857 に答える