1

を使用して単純なカレンダーを作成しましたがGridView、縦表示から横表示 (またはその逆) に切り替えるたびに、状態が保持されません。たとえば、ポートレート ビューでは 1 月に変更し、ランドスケープ ビューでは 12 月に戻ります。私はそれを修正しようとし、このコードを私のに追加しました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);
 }
4

2 に答える 2

3

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);

に設定しようとする他のコードを削除mCalendaronCreate()ます。

于 2012-12-04T23:32:11.020 に答える
0

これを試して:

mCalendar.set(year, month - 1 , 1);

提案: カレンダーの代わりに保存および復元オブジェクトとして月を使用すると、より単純になります。

于 2012-12-05T05:45:25.087 に答える