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

У меня есть 3 действия: 1 основное действие с некоторыми методами для вычисления положений x y и z, а 3 действия - это этажи, которые будут переключаться в зависимости от значения z.

Когда я перехожу от действия A (основное действие) к B, кажется, что данные, которые я использовал, сохраненные с помощью putExtra и getExtra, замораживаются до своего начального значения (то есть на 1-м putExtra). Это нормально? Если да, то знаете ли вы, как мне получить динамический доступ к x, y, z из другого действия?

В коде я покажу вам, что x, y и z вычисляются в цикле, предназначенном только для тестирования. В противном случае у меня есть другие методы для их расчета (с использованием WiFi RSSI и алгоритма градиентного спуска)

Основная деятельность

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



}

}

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

greenapps 08.04.2018 13:09
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", ...) более одного раза. Так что покончите с этой петлей.
greenapps 08.04.2018 13:12

Я не менял startActivityForResluts. Я не знаю, для чего он нужен.

Belkachait08 08.04.2018 13:18

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

greenapps 08.04.2018 13:23

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

Belkachait08 08.04.2018 13:32

Я сказал, что вам не хватает чего-то среднего между putExtra () и getIntExtra (). Так что не будет putExtra () ;-).

greenapps 08.04.2018 13:40

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

greenapps 08.04.2018 13:42

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

Belkachait08 08.04.2018 13:46

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

Belkachait08 08.04.2018 14:19

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

greenapps 08.04.2018 18:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
63
2

Ответы 2

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

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

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

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

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

Belkachait08 08.04.2018 13:42

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

hiten pannu 08.04.2018 13:46

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

Belkachait08 08.04.2018 14:19

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

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

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

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

Belkachait08 08.04.2018 15:19

Другие вопросы по теме