Сохранение данных в списке массивов при выполнении операции

#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().