这是我在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(),我正在尝试更新我通过intent extras传递的变量,但是我无法更新这些变量。
addtc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int c=e.getInt("pc");
c=c+1;
Log.i("Log","value "+c);
}
我从上面的方法得到的日志消息总是1,我认为c中的变量总是设置为0然后递增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 :(得分:0)
我可以给你的第一个建议是调试 和 发布调试结果。例如,您确定a[0]
和a[1]
不是0
吗?
假设它们不是,为什么要将bundle
声明为final
? referring to this可能final
不是你想要的。尝试删除它或替换为private
另一个建议更多是出于可读目的,将c = c+1;
替换为c++;
,但这不会改变结果,只是使其更加线性且更易于阅读。
现在经过这个修复(最终关键字一个)告诉我是否有变化请:)
答案 1 :(得分:0)
你的做法是错误的。你不能这样做。您了解&#34;额外&#34; Intent
中的内容不正确。
执行此操作时:
extras.putInt("pc",a[1]);
这会增加一个额外的&#34;额外的Bundle
。 Bundle
只是一个键/值对映射,您添加了一个包含键"pc"
的条目,其值为a[1]
。它会将a[1]
的值的副本放入Bundle
,而不会在a[1]
中添加引用{ {1}}。
因此,如果将Bundle
添加到附加内容a[1]
时为{5},则Bundle
将始终为5,并且永远不会更改为其他任何内容。
你不能这样做。
替代方案:根据您的应用程序架构以及您尝试执行的操作,您可以使用以下方法之一:
1)使用a[1]
,将数据从一个startActivityForResult()
传递到另一个Activity
,让第二个Activity
更新数据并将其重新放回Intent
,然后再Activity
回到&#34;打电话&#34; setResult()
使用static
。{/ p>
2)使用Intent
变量(基本上是&#34;全局&#34;变量)来包含数据。然后,这两项活动都可以直接访问数据(您不需要将数据放入users
。
3)将数据放入数据库。然后,这两个活动都可以从/向数据库读/写。