跨不同意图使用和更新变量

时间:2016-12-23 11:20:48

标签: android variables android-intent

这是我在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);
        }
    });
}

}

提前致谢!!!

2 个答案:

答案 0 :(得分:0)

我可以给你的第一个建议是调试 发布调试结果。例如,您确定a[0]a[1]不是0吗?

假设它们不是,为什么要将bundle声明为finalreferring to this可能final不是你想要的。尝试删除它或替换为private

另一个建议更多是出于可读目的,将c = c+1;替换为c++;,但这不会改变结果,只是使其更加线性且更易于阅读。

现在经过这个修复(最终关键字一个)告诉我是否有变化请:)

答案 1 :(得分:0)

你的做法是错误的。你不能这样做。您了解&#34;额外&#34; Intent中的内容不正确。

执行此操作时:

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

这会增加一个额外的&#34;额外的BundleBundle只是一个键/值对映射,您添加了一个包含键"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)将数据放入数据库。然后,这两个活动都可以从/向数据库读/写。