У меня есть 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);
}
}
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", ...) более одного раза. Так что покончите с этой петлей.
Я не менял startActivityForResluts. Я не знаю, для чего он нужен.
???? Не понимаю ни слова из этого. Пожалуйста, покажите, что вы делаете после putExtra () и перед getIntExtra (), где вы пытаетесь получить это значение. Вы не можете ничего не делать посередине. Сначала вы должны отправить намерение. Я думаю, вы этого не делаете.
Отправить намерение? Вы имеете ввиду putExtra?
Я сказал, что вам не хватает чего-то среднего между putExtra () и getIntExtra (). Так что не будет putExtra () ;-).
Также похоже, что вы думаете, что два действия выполняются одновременно. Не рассчитывай на это!
Итак, если я нахожусь в действии B, цикл в действии A не будет продолжаться? Мне кажется, что это так, потому что иногда всплывает другое действие (поскольку единственный start(intent), который у меня есть, находится в A).
Возможно ли, что из-за потока пользовательского интерфейса он работает не так, как ожидалось?
Урок первый для Android: вашу активность можно прекратить в любой момент.




Не уверен, как вы вкладываете дополнительные средства в намерение. Но я покажу вам, как вы должны это делать
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); »
Вы можете сделать ключ статическим членом ActivityB. Так что любое другое действие также может использовать это для предоставления данных, если это необходимо. intentForActivityB.putExtra (ActivityB.INTENT_KEY, «Ваши данные»)
Я делаю именно это, и данные не являются значением по умолчанию, это просто значение, при котором я переключаю действия.
Лучше использовать пакет, когда вы пытаетесь передать несколько данных другому действию.
Сначала создайте объект пакета
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.
Вы не показываете свои намерения и вызовы startActivity-ForResult ().