У Intent нет лишнего после onBackPressed - PullRequest
0 голосов
/ 11 июля 2020

Обновление: при нажатии кнопки Android назад (по умолчанию в нижней части экрана) все работает отлично, это только кажется проблемой с кнопкой возврата в меню ...

Я пытаюсь передать следующие намерения от моего CustomCalendarView до WorkoutButtonsActivity:

date //the date clicked on in the calendar

datesFormattedList //all 42 visible dates on the calendar

Мой текущий метод передачи намерений работает отлично, однако, когда я перехожу от WorkoutButtonsActivity к третьему действию, а затем снова нажимаю в меню, в то время как намерение даты все еще сохраняется, я теряю 'dateFormattedList`.

if (intent.hasExtra(EXTRA_VISIBLE_DATES)) ложно.

Я объявил все 3 режима запуска действий в манифесте как singleTop, однако это, похоже, не помогает.

Как я могу убедиться, что datesFormattedList есть сохраняется, даже после нажатия кнопки возврата?

CalendarView (Activity 1)

public class CustomCalendarView extends LinearLayout {

//initialisation removed for readability


    public CustomCalendarView(final Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        InitializeLayout();
        SetUpCalendar();

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setCancelable(true);

                final String date = eventDateFormat.format(dates.get(position));
                final ArrayList<String> arrayListDateFormattedList = (ArrayList<String>)datesFormattedList;

                Intent i = new Intent(getContext(), WorkoutButtonsActivity.class);
                i.putExtra(WorkoutButtonsActivity.EXTRA_DATE, date);
                i.putExtra(WorkoutButtonsActivity.EXTRA_VISIBLE_DATES, arrayListDateFormattedList);

                getContext().startActivity(i);
            }
        });
    }

    public CustomCalendarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void InitializeLayout() {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.calendar_layout, this);
        NextButton = view.findViewById(R.id.nextBtn);
        PreviousButton = view.findViewById(R.id.previousBtn);
        CurrentDate = view.findViewById(R.id.current_Date);
        gridView = view.findViewById(R.id.gridview);
    }

    void SetUpCalendar() {

        datesFormattedList.clear();

        String currentDate = dateFormat.format(calendar.getTime());
        CurrentDate.setText(currentDate);
        dates.clear();
        Calendar monthCalendar = (Calendar) calendar.clone();
        monthCalendar.set(Calendar.DAY_OF_MONTH, 1);
        int FirstDayofMonth = monthCalendar.get(Calendar.DAY_OF_WEEK) - 2;
        monthCalendar.add(Calendar.DAY_OF_MONTH, -FirstDayofMonth);

        while (dates.size() < MAX_CALENDAR_DAYS) {
            dates.add(monthCalendar.getTime());
            monthCalendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        /*THIS CONVERTS THE LIST OF ALL VISIBLE DATES TO A STRING */
        for (int i = 0; i< MAX_CALENDAR_DAYS; i++) {
            final String dateFormatted = eventDateFormat.format(dates.get(i));
            datesFormattedList.add(dateFormatted);
        }
        ChangeMonth();
    }

    public void ChangeMonth() {

        logEntriesViewModel = ViewModelProviders.of((FragmentActivity) context).get(LogEntriesViewModel.class);
        logEntriesViewModel.setFilter(datesFormattedList);
        logEntriesViewModel.getDatesFilteredByMonth().observe((FragmentActivity) context, logDates -> setData(logDates));
    }
    private void setData(List<String> logDates) {

        logDatesList.clear();
        logDatesList.addAll(logDates);
        Set<String> setWithUniqueValues = new HashSet<>(logDatesList);
        uniqueDatesWithLogEntries = new ArrayList<>(setWithUniqueValues);

        myGridAdapter = new MyGridAdapter(context, dates, calendar,uniqueDatesWithLogEntries);
        gridView.setAdapter(myGridAdapter);
    }
}

WorkoutButtonsActivity (Activity 2 - соответствующий код)

 @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.workout_list);

                getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_back);

                Intent intent = getIntent();

//THIS RETURNS TRUE AFTER BACK BUTTON PRESSED
                if (intent.hasExtra(EXTRA_DATE)) {
                    SELECTED_DATE = intent.getStringExtra(EXTRA_DATE);
                }

                setTitle(SELECTED_DATE);


// THIS RETURNS FALSE AFTER BACK BUTTON PRESSED
                if (intent.hasExtra(EXTRA_VISIBLE_DATES)) {

            EXTRA_VISIBLE_DATESS = intent.getStringArrayListExtra(EXTRA_VISIBLE_DATES);

            if (SELECTED_DATE != null && !SELECTED_DATE.isEmpty()) {
                index_number = EXTRA_VISIBLE_DATESS.indexOf(SELECTED_DATE) + 1;
            }
        }

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Попробуйте вот так:

@Override
   public void onBackPressed() {
       //intent here, and extra data....etc....
     }

И передать данные и открыть намерение в этом ...

0 голосов
/ 11 июля 2020

Вы можете хранить данные вне своей деятельности. Так что вам не придется беспокоиться о проблемах жизненного цикла.

Попробуйте что-нибудь простое, например:

public class DateKeeper{
    static ArrayList<String> calendarDates = new ArrayList<>();
    
    static void addToDates(String _date){
        calendarDates.add(_date);
    }
    
    static ArrayList<String> getDates(){
        return calendarDates;
    }
}

Это должно сработать, но, безусловно, есть более элегантное решение.

...