Сохранение состояния просмотра при переключении с портретного на ландшафтное
Я создал простой календарь, используя GridView
и всякий раз, когда я переключаюсь из портретного в ландшафтный режим (или обратно), он не сохраняет состояние. Например, я изменяю на январь в книжной ориентации, а в альбомной - обратно в декабрь. Я пытался это исправить и добавил этот код в мой OnCreate()
:
if(savedInstanceState != null && savedInstanceState.containsKey(CALENDAR)){
mCalendar = (Calendar) savedInstanceState.getSerializable(CALENDAR);
}else{
mCalendar = Calendar.getInstance();
}
И добавил этот метод в класс:
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
//Save the calendar instance in case the user changed it
outState.putSerializable(CALENDAR, mCalendar);
}
К сожалению, он не хочет работать, и месяцы все еще продолжают переключаться на первоначальный, когда меняется ориентация телефона. Может кто-нибудь, пожалуйста, помогите мне?
Код:
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calendar);
mCalendar = Calendar.getInstance(Locale.getDefault());
month = mCalendar.get(Calendar.MONTH) + 1;
year = mCalendar.get(Calendar.YEAR);
previous = (Button) findViewById(R.id.b_prevMonth);
next = (Button) findViewById(R.id.b_nextMonth);
displayMonth = (TextView) findViewById(R.id.et_displayMonth);
gv_daysOfWeek = (GridView) findViewById(R.id.gv_daysOfWeek);
gv_calendar = (GridView) findViewById(R.id.gv_calendar);
previous.setOnClickListener(this);
next.setOnClickListener(this);
displayMonth.setText(DateFormat.format(monthDisplay, mCalendar.getTime()));
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.weekdays_grid, R.id.grid_item_label, WEEK_DAYS);
gv_daysOfWeek.setAdapter(adapter);
setGridCellAdapter(month, year);
if(savedInstanceState != null && savedInstanceState.containsKey(CALENDAR)){
mCalendar = (Calendar) savedInstanceState.getSerializable(CALENDAR);
}else{
mCalendar = Calendar.getInstance();
}
}
/**
* Method responsible for intialising the adapter
*/
private void setGridCellAdapter(int month, int year) {
cellAdapter = new GridCellAdapter(getApplicationContext(),R.id.day_gridcell, month, year);
mCalendar.set(year, month - 1 , mCalendar.get(Calendar.DAY_OF_MONTH));
displayMonth.setText(DateFormat.format(monthDisplay, mCalendar.getTime()));
cellAdapter.notifyDataSetChanged();
gv_calendar.setAdapter(cellAdapter);
}
2 ответа
Вы не читаете свое сохраненное состояние до тех пор, пока не настроите GridView... Измените код, чтобы сначала прочитать сохраненное заявление:
if(savedInstanceState != null && savedInstanceState.containsKey(CALENDAR)){
mCalendar = (Calendar) savedInstanceState.getSerializable(CALENDAR);
}else{
mCalendar = Calendar.getInstance(Locale.getDefault());
}
month = mCalendar.get(Calendar.MONTH) + 1;
year = mCalendar.get(Calendar.YEAR);
// Initialize your Buttons and such...
setGridCellAdapter(month, year);
Удалите любой другой код, который пытается установить mCalendar
в onCreate()
,
Попробуй это:
mCalendar.set(year, month - 1 , 1);
Предложение: Если вы используете Месяц в качестве объекта сохранения и восстановления вместо календаря, это будет более простым.