#java #android #android-intent #android-activity #oncreate
#java #Android #android-намерение #android-активность #oncreate
Вопрос:
Я новый программист для Android. У меня есть 4 действия: A B C D. Порядок такой: A -> B -> C -> D -> A и A -> D с помощью кнопок. Я хочу сохранить данные в массиве, который находится в activity D. Проблема в том, что когда я перехожу из D в A и возвращаюсь к D, данные в ArrayList не сохраняются. Код для общего действия здесь:
public class SchedulerActivity extends AppCompatActivity {
public String name = "";
public String number = "";
public String date = "";
public String hour = "";
public ArrayList<EventClass> scheduler = new ArrayList<>();
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scheduler);
Bundle extras = getIntent().getExtras();
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SchedulerActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
}
});
if (extras != null) {
String sender = extras.getString("sender");
if(sender.compareTo("Hours") == 0) {
name = extras.getString("name");
number = extras.getString("number");
date = extras.getString("date");
hour = extras.getString("hour");
Date real_date = new Date();
SimpleDateFormat formatter1=new SimpleDateFormat("dd/MM/yyyy");
try {
real_date = formatter1.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
scheduler.add(new EventClass(real_date, name, number, "", hour));
for (EventClass event : scheduler){
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
final TextView t = new TextView(this);
t.setText(event.toString());
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
linearLayout.addView(t, params);
}
}
else{
for (EventClass event : scheduler){
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
final Button btn = new Button(this);
final TextView t = new TextView(this);
t.setText(event.toString());
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
linearLayout.addView(btn, params);
}
}
}
}
Я хочу изменить свой ArrayList, когда происходит C-> D, и распечатать его, а когда происходит D-> A, я просто хочу его распечатать. Я знаю, что могу с помощью SharedPreferences, но для первого шага я хочу сделать это с помощью ArrayList.
Каков наилучший способ сделать это?
Комментарии:
1. вы пробовали использовать intents?
2. да, конечно. вот так: Намерение intent = новое намерение(SchedulerActivity.this, MainActivity.class ); startActivity (намерение); именно так я перемещаю действия btw.
Ответ №1:
Создание статических объектов не является хорошим подходом. Таким образом, вы можете использовать Android activity stack вместо использования статического Arraylist. Действия Android хранятся в стеке activity. Возврат к предыдущему activity может означать две вещи.
Вы открыли новое действие из другого действия с помощью startActivityForResult. В этом случае вы можете просто вызвать функцию finishActivity() из своего кода, и она вернет вас к предыдущему действию. Следите за стеком activity. Всякий раз, когда вы запускаете новое действие с намерением, вы можете указать флаг намерения, такой как FLAG_ACTIVITY_REORDER_TO_FRONT или FLAG_ACTIVITY_PREVIOUS_IS_TOP. Вы можете использовать это для переключения между действиями в вашем приложении.
Комментарии:
1. Я не уверен, что понял. Если мой top равен A, и мне нужно переместиться следующим образом: A -> B -> C -> D -> A, я могу использовать FLAG_ACTIVITY_PREVIOUS_IS_TOP в B и C, и когда D завершится, он автоматически переместится в A?
Ответ №2:
Планировщик является нестатическим полем в SchedulerActivity, что означает, что его существование привязано к экземпляру activity. Когда экземпляр activity уничтожается, а это может произойти, например, при изменении ориентации экрана или переходе к другому activity, то же самое происходит со всеми его нестатическими полями. Вы можете изменить это, добавив ключевое слово static перед вашим полем:
public static ArrayList<EventClass> scheduler = new ArrayList<>();
Теперь ваше поле привязано к самому классу, а не к экземпляру, что означает, что оно не будет уничтожено вместе с экземпляром. Но это также означает, что они являются общими для всех экземпляров и на них должно ссылаться имя класса вне тела класса:
EventClass event = SchedulerActivity.scheduler.get(0)
Комментарии:
1. Рад, что смог помочь
Ответ №3:
Хороший подход заключается в сохранении ваших данных в локальной базе данных, такой как Room. Вам нужно сохранить, прежде чем перейти к новому activity, и вернуть его в onResume().