簡體   English   中英

動態putExtra()和getExtra()

[英]Dynamic putExtra() and getExtra()

我有3個活動:1個主要活動,其中一些方法可以計算xy和z位置,這3個活動是根據z的值切換的樓層。

當我從活動A(主要活動)轉到B時,我使用putExtra和getExtra保存的數據似乎被凍結為其初始值(即,在第一個putExtra處)。 正常嗎? 如果是這樣,您是否對我應該如何從另一個活動動態訪問x,y,z有任何想法?

在代碼中,我將向您顯示x,y和z是在僅用於測試的循環中計算的。 否則,我還有其他方法來計算它們(使用WiFi RSSI和Gradient Descent算法)

主要活動

    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);



}

}

不知道您打算如何使用這些功能。 但我會告訴你你應該怎么做

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

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

因此,也許在您的情況下,數據沒有凍結,只是為您提供了默認值。

嘗試將多個數據傳遞到另一個活動時,最好使用捆綁軟件。

首先創建一個捆綁對象

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");

捆綁軟件支持許多數據類型。 請查看捆綁包文檔以了解更多詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM