2016-12-23 7 views
0

これは私の最初の質問はstackoverflowで尋ねられています。私の質問は、さまざまなリサイクル可能なインテントでのさまざまな使用に関するものです。異なるインテントで変数を使用して更新する

eはこのように宣言されています。

final Bundle e=getIntent().getExtras(); 

ここでは、別のsetOnClickListener()に対して新しいインテントを作成し、それぞれのインテントごとに異なる変数を渡しています。

  Intent info = new Intent(EItemListView.this, ItemInfo.class); 
      Bundle extras = new Bundle(); 
      int[] a=new int[listview.getAdapter().getCount()]; 
      if (i == 0) { 
       extras.putIntArray("img", n5x_images); 
       extras.putString("info", n5x_info); 
       extras.putInt("pc",a[0]); 
      } else if (i == 1) { 
       extras.putIntArray("img", op3_images); 
       extras.putString("info", op3_info); 
       extras.putInt("pc",a[1]); 
      } 
      info.putExtras(extras); 
      startActivity(info); 

さて、これは私が意図エキストラを通過した変数を更新しようとしているが、これらの変数を更新することができませんしていますOnClickListener()です。

addtc.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      int c=e.getInt("pc"); 
      c=c+1; 
      Log.i("Log","value "+c); 
     } 

iは、上記の方法から得るログメッセージは、私はC言語で変数は常に0に設定し、1ずつインクリメントし、従って、ログメッセージは、私は、変数を必要とする1 を示していると思い、常に1でありますa [0]、a [1]、a [2]などをインクリメントしてインクリメント操作を行います。

もっと明確にするために、これは私が使用しているJavaファイルです。エラーは、このコードの最後にあるaddtcボタンのOnClickListenerにあります。事前に

public class ItemInfo extends AppCompatActivity { 

private ViewAnimator viewanimator; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_item_info); 

    Button next=(Button)findViewById(R.id.bnext); 
    Button prev=(Button)findViewById(R.id.bprev); 
    viewanimator=(ViewAnimator)findViewById(R.id.viewAnimator); 
    TextView info=(TextView)findViewById(R.id.item_info); 
    Button addtc=(Button)findViewById(R.id.badd); 
    Button test=(Button)findViewById(R.id.button); 

    Bundle e=getIntent().getExtras(); 
    int img[]=e.getIntArray("img"); 


    for(int i=0;i<img.length;i++) 
    { 
     ImageView imgview = new ImageView(getApplicationContext()); 
     imgview.setImageResource(img[i]); 
     viewanimator.addView(imgview); 
    } 

    info.setText(e.getString("info")); 

    next.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      viewanimator.showNext(); 
     } 
    }); 

    prev.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      viewanimator.showPrevious(); 
     } 
    }); 

    addtc.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      int c=e.getInt("pc"); 
      c=c++; 
      Log.i("Log","value "+c); 
     } 
    }); 
} 

}

感謝!私はあなたを与えることができ

+0

'int c = e.getInt(" pc ");'どこでeを初期化していますか? –

+0

そして、バンドルする値を追加する場所でコードをデバッグしようとしましたか? –

+0

をデバッグすると、インテントを渡す前のa [0]かa [1]のどちらの値ですか? –

答えて

0

あなたのアプローチが間違っている:)してください変更された場合は

は今、この修正プログラム(finalキーワード1)の後を教えてください。このようにすることはできません。 Intentの「余分な」内容が間違っていることの理解。

あなたが行う場合は、この:エキストラBundle

  extras.putInt("pc",a[1]); 

これは "余分" が追加されます。 Bundleは単にキーと値のペアのマップであり、キー"pc"を含むエントリを追加しました。値はa[1]です。それはBundlea[1]の値のコピーを置き、それがBundlea[1]参照を入れていません。

したがって、a[1]を5にすると、Bundleに追加すると、a[1]は常に5になり、他のものに変更されることはありません。

このようにすることはできません。

オルタナティブ:アプリケーションのアーキテクチャに応じて、何あなたがやろうとしている、あなたは次のいずれかの方法を使用することができます。

1)、startActivityForResult()を使用して別のActivityからデータを渡し、二Activityを持っていますデータを更新してIntentに戻してから、setResult()を使用して「呼び出し」Activityに戻します。

2)static変数(基本的には「グローバル変数」)を使用してデータを格納します。両方のアクティビティでデータに直接アクセスできます(データをIntentに入れる必要はありません)。

3)データをデータベースに格納します。両方のアクティビティは、データベースに対して読み書きできます。

+0

私はまだこの問題の解決策に到達できませんでした。私はいくつかの項目を持つlistViewを持ち、各項目はすべてのOnClickListener()で新しいインテントを開始するので、OnClickListener()を介して開かれた各インテントに対して別々の変数が必要です。 –

+0

各項目に異なる変数は必要ありません。各アイテムに一意のインデックスが必要です。この索引は、その項目と関連付けられたデータにアクセスするために使用されます。このデータを静的な 'ArrayList'またはデータベースに保持したり、項目インデックスをインクルードしている限り、' startActivityForResult() 'を使って一つの項目に関連するデータを前後に送ることができます。データが属する項目。 –

+0

私はまだこれに固執しています、私はいくつかの異なることを試みましたが、希望の結果を得ることができませんでした。私は次の機能を達成したい、アイテムのリストが開き、すべてのlistitemには、各アイテムの新しいインテントを表示するOnClickListenerがあります。そのインテントには、「カートに追加」ボタンがあります。カート。今、カート活動が開かれたとき、それらのアイテムはすべて「カートに入れる」ボタンが押された –

0

まずアドバイスはデバッグ投稿デバッグ結果です。たとえば、a[0]a[1]0ではありませんか?

そうでないと仮定すると、なぜbundlefinalと宣言していますか? referring to thisおそらくfinalはあなたが探していたものではありません。それを削除するか、private

もう一つの提案は読める目的のために、よりあると交換してみてください、これは結果を変更しませんc++;なく、c = c+1;を置き換え、それだけで読書のためのそれはより直線的かつ容易になります。何かが

+0

最終的なキーワードは、 'e'が内部クラスからアクセスされることです。 –

+0

@ Androidjack-RajeshGosemath protectedまたはpublicもOKです。最終的なキーワードはセッターを無効にするので、これは問題を引き起こす可能性があります。私が言ったようにそれを取り除こうとしましたか? –

関連する問題