2011-02-04 15 views
4

私は倍数モードで使用する活性を有しているので、私はこのようなことを行う必要があります:意図のエキストラを取得することができません

Intent i = new Intent(MainListActivity.this,MainActivity.class); 
    extras.putInt("id", c.getId()); 
    extras.putInt("mode", AREA_MODE); 
    i.putExtra("extras", extras); 
    startActivity(i); 

onCreateで:

Intent i = this.getIntent(); 
    extras = i.getBundleExtra("extras"); 
    if(extras!=null){ 
     id = extras.getInt("id", -1); 
     mode = extras.getInt("mode", COUNTRY_MODE); 
    } 

しかし意図をエクストラは常にnullです。何か不足していますか?これを行う方法はありますか?

EDIT:何らかの理由でgetIntent()メソッドが私のケースでは余分な(主な意図がない)前のIntentを返します。私はなぜそれを理解しようとしています。

+0

いくつかのことを再確認しましょう。 'MainActivity'メソッドの完全な' onCreate'メソッドと、このインテントを生成する 'MainListActivity'メソッドの完全メソッドを投稿できますか?また、あなたは前の意図を得ているので、なぜあなたはMainListActivityの 'onCreate'も表示しないでください。 –

+0

あなたのc.getId()は本当にintではないかもしれません。私はgetId()と同じような問題を抱えていましたが、通常はアルファベット文字で文字列を返しましたが、時には数字だけを文字列に渡しました。この場合、AndroidのputExtra(String、String)は面白い変換を行い、getStringで取得しようとするとnullになってしまいましたが、getIntで取得できました。 – midnight

答えて

0

私はこの問題の原因を見つけることができませんでしたので、私は1つのアクティビティの使用を断念しました。私は、問題のあるものを広げる他の活動を創り出し、それは両方のアプローチで働き始めました。皆さんのお手伝いをありがとうございます。

3

は次のように試してみてください:

1つの活動では:別のアクティビティで

Intent i = new Intent(); 
Bundle bundle = new Bundle(); 
bundle.putInt("id", c.getId()); 
bundle.putInt("mode", AREA_MODE);  
i.putExtras(bundle); 

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
    id = extras.getInt("id", -1); 
    mode = extras.getInt("mode", COUNTRY_MODE);  
} 
+0

これを試してみると思います。 –

2

それは、このする必要があります。

Intent i = new Intent(MainListActivity.this ,MainActivity.class); 
i.putExtra("id", c.getId()); 
i.putExtra("mode", AREA_MODE); 
startActivity(i); 

Intent i = this.getIntent(); 
id = i.getIntExtra("id", -1); 
mode = i.getIntExtra("mode", COUNTRY_MODE); 
+0

彼は 'MainListActivity'から' MainActivity'を開始しています。彼は内部クラスにあるので、おそらく 'this'の代わりに(あなたのコードが変更された)' MainListActivity.this'を必要とします。 –

+0

おかげさまで私はそれを誤解した。 –

0

あなたはが意図にこの方法をエキストラを追加しないでください

i.putExtra("extras", extras); 

これは意図に "エクストラ" と呼ばれる余分を置きます。あなたの「エキストラ」はインテントの中で非標準的な場所にあります。 onCreate()コードが "extras"にマッピングされたオブジェクトを取得して調べていた場合は、 "extras"が見つかります。

標準的な方法は、bundleを移入し、putExtrasを経由して目的にそれを追加することです:

i.putExtras(bundle); 

またはputExtraなどの便利なメソッドを使用します。

i.putExtra("mode", AREA_MODE); 
+0

既にこれを試しても同じ結果が得られます –

+0

"extras"を使用するのは、とにかく推奨される方法ではありません。標準的なアプローチを使用するとどうなりましたか? –

+0

まだ同じです。前のインテントが返されます。 –

2

Aha!私はこの問題をデバッグしました。微妙な詳細documented in PendingIntentのためにであることが判明しました。

  • PendingIntentは、システムが維持するトークンへの参照です。したがって、送信プロセスが再開しても、同様のインテントを再構築すると、元のPendingIntentが取得されます。その後、送信者はそれをキャンセルまたは変更できます。
  • 同様の目的 ==同じ操作、アクション、データ、カテゴリ、コンポーネント、フラグ。エクストラは数えません!
  • エクストラでのみ異なるインテントは、すべて同じトークンを取得します。よくある間違いの人々が作る

のみ異なるPendingIntentを毎回取得するために期待し、彼らの「エクストラ」の内容が異なるインテントで複数のPendingIntentオブジェクトを作成することです。これはではなく、が発生します。

修正1:明確な PendingIntentを作成します。それは、異なる操作、アクション、データ、カテゴリ、コンポーネント、またはフラグを持たなければならず、コード整数を要求しなければなりません。

修正2:使用FLAG_CANCEL_CURRENTまたはFLAG_UPDATE_CURRENTへの既存のPendingIntentをキャンセルするかを変更します。

これらの2つの修正により、わずかに異なる結果が生成されます。いずれにしても、あなたの新しいエクストラが手に入るはずです。

関連する問題