动态putExtra()和getExtra()

时间:2018-04-08 11:03:27

标签: java android android-activity

我有3个活动:1个主要活动,有一些计算x和z位置的方法,3个活动是将根据z的值切换的楼层。

当我从活动A(主要活动)转到B时,似乎我用putExtra和getExtra保存的数据被冻结到它们的初始值(即第一个putExtra)。这是正常的吗?如果是这样,您是否知道如何从另一个活动中动态访问x,y,z?

在代码中,我将向您展示x,y和z是在仅用于测试的循环中计算的。否则我有其他方法来计算它们(使用WiFi RSSI和梯度下降算法)

MainActivity

    public class MainActivity extends AppCompatActivity {
           ImageView myImageView;
           int i = 0;
           int z = 1;
           int x,y,f=1;
           final int imageWidth = 930;
           final int imageHeight = 560;
           private Timer timer;
           int flag_activity=1;

[...] 意图初始化

    final Intent intent0 = new android.content.Intent(this, Rdc.class);
    final Intent intent2 = new android.content.Intent(this, r2.class);
    intent0.putExtra("X", i);
    intent0.putExtra("Y", i);
    intent0.putExtra("Z", f);

    intent2.putExtra("X", i);
    intent2.putExtra("Y", i);
    intent2.putExtra("Z", f);


    myImageView = (ImageView) findViewById(R.id.imageView);
    VectorDrawableCompat vectorDrawable = VectorDrawableCompat.create(getResources(), R.drawable.ic_android_black_24dp, null);
    myImageView.setImageDrawable(vectorDrawable);

// ...

循环更新图像并根据f:

的值更改活动
    Timer T=new Timer();
    T.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    i++;
                    i=i%10;
                    if(i==7) {f++; f=f%3;}
                    updateTextView(i,i,f);


                    if(f==1) {
                        myImageView.setTranslationX(i * imageWidth / 10);
                        myImageView.setTranslationY(i * imageHeight / 10);
                        flag_activity=1;
                    }
                    else {
                        if(f==2&&flag_activity!=2) {startActivity(intent2); flag_activity=2;}
                        else {
                            if(f==0&&flag_activity!=0) {startActivity(intent0); flag_activity=0;}
                        }                        }


                }
            });
        }
    }, 1000, 1000);

另一项活动(除了某些资源外,其他两项活动相同)。

public class r2 extends AppCompatActivity {
ImageView myImageView;
int imageWidth=930;
int imageHeight=560;
int x,y,z;


public void updateTextView(int a, int b, int c) {
    String str="x :"+Integer.toString(a)+"y :"+Integer.toString(b)+"f :"+Integer.toString(c);
    TextView textView = (TextView) findViewById(R.id.textView3);
    textView.setText(str);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_r2);

    myImageView = (ImageView) findViewById(R.id.imageView);
    VectorDrawableCompat vectorDrawable = VectorDrawableCompat.create(getResources(), R.drawable.ic_android_black_24dp, null);
    myImageView.setImageDrawable(vectorDrawable);


    Timer T2=new Timer();
    T2.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {

                    x = getIntent().getIntExtra("X",1);
                    y = getIntent().getIntExtra("Y",1);
                    z = getIntent().getIntExtra("Z",1);
                    updateTextView(x,y,z);

                    if(z==2) {

                        myImageView.setTranslationX(x * imageWidth / 10);
                        myImageView.setTranslationY(y * imageHeight / 10);
                    }
                    else {
                        finish();
                    }
                }
            });
        }
    }, 1000, 1000);



}

}

2 个答案:

答案 0 :(得分:0)

不确定如何将额外内容放入意图中。但我会告诉你应该怎么做

Intent intentForActivityB = new Intent(this,ActivityB.class);
intentForActivityB.putExtra("YourKey","Your data")
startActivity(intentForActivityB);

Inside ActivityB
intent.getIntExtra("YourKey",defaultValue);

因此,在您的情况下,数据不会被冻结,只是为您提供默认值。

答案 1 :(得分:0)

当您尝试将多个数据传递到另一个活动时,最好使用bundle。

首先创建一个包对象

Bundle bundle = new Bundle();
bundle.putString("key1", "string data");
bundle.putInt("key2",12345);

然后有意地传递你的包。小心你必须使用putExtras而不是putExtra

Intent intent = new Intent(context, destinationClass);
intent.putExtras(bundle);

然后启动意图

context.startActivity(intent);

在目标类上,您可以使用getExtras

接收包
Bundle bundle =getIntent().getExtras();

从该捆绑包中,您可以提取数据

String yourStringData = 
bundle.getString("key1");
int youtIntData = bundle.getInt("key2");

Bundle支持许多数据类型。有关详细信息,请查看bundle documentation