Динамический putExtra() и getExtra()

avatar
Belkachait08
8 апреля 2018 в 11:03
69
2
0

У меня есть 3 действия: 1 основное действие с некоторыми методами для вычисления позиций x, y и 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);



}

}

Источник
greenapps
8 апреля 2018 в 11:09
0

Вы не показываете свои намерения и вызовы startActivity-ForResult().

greenapps
8 апреля 2018 в 11:12
0

it seems like the datas i've used saved with putExtra and getExtra are frozen to their initial value (i.e. at the 1st putExtra).. Нет до последнего. Имеет смысл вызывать putExtra("X", ...) более одного раза. Так что избавьтесь от этой петли.

Belkachait08
8 апреля 2018 в 11:18
0

Я не изменил startActivityForResluts. Я не знаю, каково его использование.

greenapps
8 апреля 2018 в 11:23
0

???? Не понимаю ни слова. Пожалуйста, покажите, что вы делаете после putExtra() и перед getIntExtra(), где вы пытаетесь получить это значение. Вы не можете просто ничего не делать между ними. Вы должны отправить намерение в первую очередь. Я думаю, вы не то делаете.

Belkachait08
8 апреля 2018 в 11:32
0

Отправить намерение? Вы имеете в виду putExtra?

greenapps
8 апреля 2018 в 11:40
0

Я сказал, что вы упустили что-то между putExtra() и getIntExtra(). Так что не будет поставитьExtra() ;-).

greenapps
8 апреля 2018 в 11:42
0

Это также выглядит так, как будто вы думаете, что два действия выполняются одновременно. Не рассчитывайте на это!

Belkachait08
8 апреля 2018 в 11:46
0

Итак, если я нахожусь в действии B, цикл в действии A не будет продолжаться? Мне кажется, что это так, потому что иногда появляется другая активность (поскольку у меня есть только start(intent) в A ).

Belkachait08
8 апреля 2018 в 12:19
0

Возможно ли, что из-за потока пользовательского интерфейса он работает не так, как ожидалось?

greenapps
8 апреля 2018 в 16:58
0

Урок Android первый: ваша активность может быть прервана в любой момент.

Ответы (2)

avatar
Supto
8 апреля 2018 в 11:53
0

При попытке передать несколько данных другому действию лучше использовать пакет.

Сначала создайте объект пакета

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 поддерживает множество типов данных. Пожалуйста, ознакомьтесь с документацией по пакету для более подробной информации

Belkachait08
8 апреля 2018 в 13:19
0

Спасибо за ответ. Это все еще ничего не меняет в отношении моей проблемы. Данные, которые я пытаюсь отправить в действие B, не обновляются при изменении в действии A.

avatar
hiten pannu
8 апреля 2018 в 11:35
0

Не знаю, как вы добавляете дополнительные элементы в намерение. Но я покажу вам, как вы должны это сделать

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

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

Возможно, в вашем случае данные не заморожены, а просто дают вам значение по умолчанию.

Belkachait08
8 апреля 2018 в 11:42
0

Подождите, как мне получить доступ во втором действии "yourKey", не должен ли я сделать что-то вроде "int yourKey=intent.getIntExtra("YourKey",defaultValue);'

hiten pannu
8 апреля 2018 в 11:46
0

Вы можете сделать ключ статическим членом ActivityB. Так что любая другая деятельность также может использовать это для предоставления данных, если это необходимо. намерениеForActivityB.putExtra(ActivityB.INTENT_KEY,"Ваши данные")

Belkachait08
8 апреля 2018 в 12:19
0

Я делаю именно это, и данные не являются значением по умолчанию, это просто значение, в котором я переключаю действия.