2011-05-03 4 views
0

내 질문에 대해 매우 짧은 테스트 케이스 (아래)를 준비했습니다.Blackberry : 목록에서 항목을 선택하고 이전 화면으로 돌아갑니다.

버튼을 클릭하면 새 화면에 문자열 목록을 표시하고 싶습니다.

사용자가 목록에서 항목을 하나 선택하면 이전 화면이 다시 표시되고 단추 레이블이 선택한 문자열로 설정되어야합니다.

screenshot

내이 문제는 다음과 같습니다

메뉴 내에서
  1. 나는 현재 표시된 화면을 팝업하는 방법을 모르는 다른 하나의 화면에서 선택한 항목을 전달하는 방법을
  2. (임시 해결책으로 공용 변수/메소드를 도입하지 않으려는 경우)

필요한 c를 제안하십시오. 대한 hanges 내 SRC \ myPackage에 \ MyList.java :

package mypackage; 

import java.util.*; 
import net.rim.device.api.collection.*; 
import net.rim.device.api.collection.util.*; 
import net.rim.device.api.system.*; 
import net.rim.device.api.ui.*; 
import net.rim.device.api.ui.component.*; 
import net.rim.device.api.ui.container.*; 
import net.rim.device.api.ui.decor.*; 
import net.rim.device.api.util.*; 
import net.rim.device.internal.i18n.*; 

public class MyList extends UiApplication implements FieldChangeListener { 
    MyScreen myScreen = new MyScreen(); 

    public static void main(String args[]) { 
     MyList app = new MyList(); 
     app.enterEventDispatcher(); 
    } 

    public MyList() { 
     MainScreen titleScreen = new MainScreen(); 
     titleScreen.setTitle("Click the button:"); 

     // TODO change the label of this button (see below) 
     ButtonField myButton = new ButtonField("Show the list", ButtonField.CONSUME_CLICK); 
     myButton.setChangeListener(this); 
     titleScreen.add(myButton); 

     pushScreen(titleScreen); 
    } 

    public void fieldChanged(Field field, int context) { 
     pushScreen(myScreen); 
    } 
} 

class MyScreen extends MainScreen { 
    ObjectListField myList = new ObjectListField(); 

    public MyScreen() { 
     setTitle("Select an item below:"); 

     myList.set(new String[] { "Item 1", "Item 2", "Item 3", "Item 4", }); 
     add(myList); 

     addMenuItem(myMenu); 
    } 

    private final MenuItem myMenu = new MenuItem("Select item", 0, 0) { 
     public void run() { 
      int index = myList.getSelectedIndex(); 
      if (index < 0) 
       return; 

      String item = (String) myList.get(myList, index); 
      Status.show("Selected: " + item); 

      // TODO how to return to the previous screen here? 
      // TODO how to call myButton.setLabel(item) here? 
     } 
    }; 
} 

감사합니다! 알렉스

답변

0

를 사용하여 콜백 패턴 :

class TitleScreen extends MainScreen { 

    private ButtonField myButton; 

    public TitleScreen() { 
     super(); 
     setTitle("Click the button:"); 

     // TODO change the label of this button (see below) 
     myButton = new ButtonField("Show the list", ButtonField.CONSUME_CLICK); 
     myButton.setChangeListener(new FieldChangeListener() { 
      public void fieldChanged(Field field, int context) { 
       OnItemSelectedCallback callback = 
         new OnItemSelectedCallback() { 
        public void onItemSelected(String label) { 
         TitleScreen.this.onItemSelected(label); 
        } 
       }; 
       MyScreen myScreen = new MyScreen(callback); 
       UiApplication.getUiApplication().pushScreen(myScreen); 
      } 
     }); 
     add(myButton); 
    } 

    private void onItemSelected(String label) { 
     // this will be called when a menu item is executed on the MyScreen 
     // e.g. you can call smth like: myButton.setLabel(label); 
    } 
} 

interface OnItemSelectedCallback { 
    void onItemSelected(String label); 
} 

class MyScreen extends MainScreen { 
    ObjectListField myList = new ObjectListField(); 

    private final OnItemSelectedCallback onItemSelectedCallback; 

    public MyScreen(OnItemSelectedCallback onItemSelectedCallback) { 
     setTitle("Select an item below:"); 

     this.onItemSelectedCallback = onItemSelectedCallback; 

     myList.set(new String[] { "Item 1", "Item 2", "Item 3", "Item 4", }); 
     add(myList); 

     addMenuItem(myMenu); 
    } 

    private final MenuItem myMenu = new MenuItem("Select item", 0, 0) { 
     public void run() { 
      int index = myList.getSelectedIndex(); 
      if (index < 0) 
       return; 

      String item = (String) myList.get(myList, index); 
      Status.show("Selected: " + item); 

      // TODO how to return to the previous screen here? 
      // TODO how to call myButton.setLabel(item) here? 

      // notify the parent screen 
      onItemSelectedCallback.onItemSelected(item); 

      // close the current screen 
      UiApplication.getUiApplication().popScreen(MyScreen.this); 
     } 
    }; 
}