1

私はBlackBerryの初心者です。Androidと同じように(BlackBerryで)達成するにはどうすればよいですか

intent.putExtra("key","value");

BlackBerry で次に押された画面で受信できる値を入れます。

AndroidのようにActivityOne-

Intent intent = new Intent(this, ActivityTwo.class);
intent.putExtra("Value1", "This value one for ActivityTwo ");
intent.putExtra("Value2", "This value two ActivityTwo"); 
startActivity(intent);

ActivityTwo-

Bundle extras = getIntent().getExtras();
if (extras == null) {
    return;
}
// Get data via the key
String value1 = extras.getString(Intent.EXTRA_TEXT);
if (value1 != null) {
    // Do something with the data
} 

そのようなことは BlackBerry で可能ですか? はいの場合、どうすればこれを行うことができますか?

4

3 に答える 3

3

(Ganesh の回答のように) 変数を使用public staticするとうまくいきますが、一般的に、それは私がお勧めするオブジェクト指向のパターンではありません。

幸いなことに、これAndroid よりも BlackBerry の方が簡単です。Android のIntentメカニズムは、実際には多くの Java 開発者にとってやや不自然です。を介して別のインスタンスをActivity起動すると、実際には 2 番目のインスタンスが作成 (作成)されず、そのオブジェクトへの通常の Java 参照も保持されません。もしそうなら、この問題ははるかに簡単になります。Android の実装では、インテント エクストラメカニズムを使用する必要があります。ActivityIntentnewActivity

古いActivityOneクラスがScreenOneBlackBerry 用にActivityTwoなりScreenTwo、 になった場合は、次のようなことができます。

public class ScreenTwo extends Screen {
    private String _value1;   // this doesn't have to be a String ... it's whatever you want
    private String _value2;

    public void setValue1(String value) {
       _value1 = value;
    }
    public void setValue2(String value) {
       _value2 = value;
    }
}

次に、 では、この方法でScreenOne開始できますScreenTwo

ScreenTwo nextScreen = new ScreenTwo();
nextScreen.setValue1("This value one for ActivityTwo");
nextScreen.setValue2("This value two ActivityTwo");
UiApplication.getUiApplication().pushScreen(nextScreen);

これは実際には、Java オブジェクトが通常使用され、相互に対話する方法とより一致しています。

Android が作られた理由Intents追加機能には十分な理由がありますが、BlackBerry ではそれについて心配する必要はありません。


編集:以下のスミス氏のコメントの背後にある動機は何かを考えようとしています. Intent複数のデータ型をキーと値のペアとして渡すことができるという意味でAndroid のエクストラ メカニズムが実際に気に入っている場合はActivity、BlackBerry でも同様のことを確実に実現できます。上記のコードの代わりに、ScreenTwoこれを使用できます。

public class ScreenTwo extends Screen {
    private Hashtable _extras;

    public void putExtras(Hashtable extras) {
        _extras = extras;
    }
}

put(Object, Object)キーと値のペアのデータをHashtable呼び出された画面に渡して、必要なときに読み取る場所。あるいは:

public class ScreenTwo extends Screen {
   private Hashtable _extras;

   public void putExtra(String name, Object value) {
      _extras.put(name, value); 
   }
}
于 2012-07-07T20:31:15.817 に答える
1

これは、ほとんどのプロジェクトで使用しなくなるため、一度よく設計する価値のあるものです。

まず、Android の BB のような組み込みメカニズムはありませんが、独自のコードを作成できます (またそうする必要があります)。

    public class MyScreen extends MainScreen {

        public void updateParams(Hashtable params){
            // Read from hashtable and cast
            // Update fields (on Ui thread)
        }

    }

ご覧のとおり、最も柔軟な方法であるため、ハッシュテーブルを使用しました。セッターを使用することもできますが、呼び出し画面を更新された画面クラスに結合することになります。これにより、1 つまたは複数のパラメーターを渡すことができます。を使用しObject[]ていくつかの参照を節約することもできましたが、その最適化はほとんど効果がなく、配列の長さと配列内のオブジェクトの順序に結合されます。ここで、2 つのパラメーターを画面に渡すには、次のようにします。

    Hashtable ht = new Hashtable();
    ht.put("somestring", "Hello!");
    ht.put("someint", new Integer(3));

    MainScreen ms = new MyScreen();
    targetscreen.updateParams(ht);
    // Now push screen

次のようなコンストラクタを作成することもできます。

Myscreen(Hashtable params)

ただし、これにより、画面を新しいデータで更新する必要があるたびに、新しいインスタンスを作成する必要があります。メソッドを使用すると、既にスタックにある画面を更新できます。

これは、多くのプロジェクトで再利用できるアプローチです。実際、ほとんどの場合、MainScreen のサブクラス化を終了して、メニューの作成やキー操作の処理などの反復的なタスクを抽象化および簡素化するため、これはそのサブクラスの一部になります。

于 2012-07-09T07:39:18.590 に答える
0

1 つのパブリック クラスを作成し、

public class Values 
{
    public static String value1 ="";
    public static String value2 ="";
}

これで、どこからでも value1 と value2 にアクセスできます。

次の画面を押す前に、値を割り当てます。

public class MyClass extends UiApplication 
{


    MyClass mc = null;
    public static void main(String args[]) 
    {
        mc = new MyClass();
        if (MyClass != null)
        {
            mc.enterEventDispatcher();
        }
    }

    public MyClass() 
    {
               Values.value1 ="HI"
               Values.value2 ="Welcome"
    this.pushScreen(new SplashScreen());
    }

別のクラスでは、アクセスできます。

public class Splashscreen()
{
   public Splasscreen()
{
       if(!Values.Value1.equalIgnoreCase("")
{
           Syso(""+Values.value1)   ;
}
}
于 2012-07-07T13:36:43.080 に答える