This is an easy question perhaps but I have been researching since yesterday and can not found the solution so I decided to put it here.
My app uses nav drawer and one of the menu is statistics,, let's jump to the code
public class StatisticsFragment extends Fragment implements
OnItemSelectedListener {
protected static final String tag = "Statistic Fragment";
private NDIcsSpinner spinDate;
private FragmentActivity context;
private SimpleDateFormat defaultDateFormat;
protected String startDate, endDate;
private CheckBox cbCompare;
// private boolean isConfigChanged = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
// setRetainInstance(true);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Clog.d(tag, "[onSaveInstanceState]");
outState.putString("startDate", startDate);
outState.putString("endDate", endDate);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Clog.d(tag, "[onCreateView]");
View v = inflater
.inflate(R.layout.statistic_fragment, container, false);
if (savedInstanceState != null) {
Clog.d(tag, "[onCreateView] savedInstanceState is not null and configuration has changed");
startDate = savedInstanceState.getString("startDate");
endDate = savedInstanceState.getString("endDate");
// isConfigChanged = true;
}
spinDate = (NDIcsSpinner) v.findViewById(R.id.sta_date);
cbCompare = (CheckBox) v.findViewById(R.id.sta_check_compare);
// define default date format
defaultDateFormat = new SimpleDateFormat("MMMM d, yyyy");
context = getActivity();
ArrayAdapter<String> dateAdapter = new ArrayAdapter<String>(context,
com.actionbarsherlock.R.layout.sherlock_spinner_item,
getResources().getStringArray(R.array.date_array));
dateAdapter
.setDropDownViewResource(com.actionbarsherlock.R.layout.sherlock_spinner_dropdown_item);
spinDate.setAdapter(dateAdapter);
spinDate.setOnItemSelectedListener(this);
// compare to previous period checkbox
cbCompare.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Clog.d(tag, "[cbcompare] onCheckedChanged");
updateFragments();
}
});
if (getChildFragmentManager().findFragmentById(R.id.staper_frame) == null) {
Clog.d(tag, "[onCreateView] fragment is null");
Fragment fragment = new StaperFragment();
fragment.setArguments(getAllArguments());
FragmentTransaction transaction = getChildFragmentManager()
.beginTransaction();
Fragment f2 = new StadiffFragment();
f2.setArguments(getAllArguments());
transaction.add(R.id.staper_frame, fragment);
transaction.add(R.id.stadiff_frame, f2);
transaction.commit();
}
return v;
}
private Bundle getAllArguments() {
Bundle args = new Bundle();
args.putString("startDate", startDate);
args.putString("endDate", endDate);
args.putBoolean("isCompare", cbCompare.isChecked());
return args;
}
protected void showDialogStartEndDate() {
Clog.d(tag, "[showDialogStartnEndDate]");
// show first dialog
Toast.makeText(getActivity(), "Start", Toast.LENGTH_SHORT).show();
CalendarDatePickerDialog cd = new CalendarDatePickerDialog();
cd.setTargetFragment(StatisticsFragment.this, 100);
cd.setOnCancelListener(new OnDateCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Clog.d(tag, "[setOnCancelListener] onCancel");
updateFirstField();
}
});
cd.setOnDateSetListener(new OnDateSetListener() {
// Using start to create a temporary startDate to consequence on
// back pressed in second picker
private String start;
@Override
public void onDateSet(CalendarDatePickerDialog dialog, int year,
int monthOfYear, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, monthOfYear, dayOfMonth);
start = defaultDateFormat.format(calendar.getTime());
Toast.makeText(getActivity(), "End", Toast.LENGTH_SHORT).show();
CalendarDatePickerDialog cd2 = CalendarDatePickerDialog
.newInstance(null, year, monthOfYear, dayOfMonth);
cd2.setTargetFragment(StatisticsFragment.this, 100);
cd2.setOnCancelListener(new OnDateCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// Clog.d(tag, "[setOnCancelListener] onCancel");
updateFirstField();
}
});
cd2.setOnDateSetListener(new OnDateSetListener() {
@Override
public void onDateSet(CalendarDatePickerDialog dialog,
int year, int monthOfYear, int dayOfMonth) {
Calendar calendar2 = Calendar.getInstance();
calendar2.set(year, monthOfYear, dayOfMonth);
endDate = defaultDateFormat.format(calendar2.getTime());
startDate = start;
updateFirstField();
}
});
cd2.show(getFragmentManager(), "endDate");
}
});
cd.show(getFragmentManager(), "startDate");
}
/**
* This is for updating the textview in spinner with the latest start and
* end date
*/
private void updateFirstField() {
String finalString = startDate + " - " + endDate;
TextView getText = (TextView) spinDate.getChildAt(0);
getText.setText(finalString);
Clog.d(tag,
"[updateFirstField] spinDate position : "
+ spinDate.getSelectedItemPosition());
// cbCompare.setChecked(false);
updateFragments();
}
/**
* Update start and end date with respective days
*
* @param i
* @return
*/
private void updateTextDate(int i) {
Calendar cal = Calendar.getInstance();
endDate = defaultDateFormat.format(cal.getTime());
cal.add(Calendar.DAY_OF_MONTH, -i);
// get date string
startDate = defaultDateFormat.format(cal.getTime());
// update
updateFirstField();
}
private void updateFragments() {
Clog.d(tag, "[updateFragments]");
Fragment staperFragment = new StaperFragment();
staperFragment.setArguments(getAllArguments());
Fragment f2 = new StadiffFragment();
f2.setArguments(getAllArguments());
FragmentTransaction trans = getChildFragmentManager()
.beginTransaction();
trans.replace(R.id.stadiff_frame, f2);
trans.replace(R.id.staper_frame, staperFragment);
trans.commit();
}
@Override
public void onItemSelected(IcsAdapterView<?> parent, View view,
int position, long id) {
// if (!isConfigChanged) {
Clog.d(tag, "[onCreateView] spinDate onItemSelected ");
switch (position) {
case 0:
updateTextDate(6);
break;
case 1:
updateTextDate(29);
break;
case 2:
updateTextDate(119);
break;
case 3:
showDialogStartEndDate();
break;
default:
break;
}
// } else {
// isConfigChanged = false;
// updateFirstField();
// }
}
@Override
public void onNothingSelected(IcsAdapterView<?> parent) {
// TODO Auto-generated method stub
}
So, in the layout I have spinner, 1 checkbox and 2 frame layouts, the problem is when the orientation changed, the spinner got selected twice.
First Time
01-03 08:40:18.061: D/Statistic Fragment(5007): [onCreateView] spinDate onItemSelected
01-03 08:40:18.061: D/Statistic Fragment(5007): [updateFirstField] spinDate position : 0
01-03 08:40:18.061: D/Statistic Fragment(5007): [updateFragments]
On Configuration Changed
01-03 08:40:22.253: D/Statistic Fragment(5007): [onSaveInstanceState]
01-03 08:40:22.313: D/Statistic Fragment(5007): [onCreateView]
01-03 08:40:22.317: D/Statistic Fragment(5007): [onCreateView] savedInstanceState is not null and configuration has changed
01-03 08:40:22.561: D/Statistic Fragment(5007): [onCreateView] spinDate onItemSelected
01-03 08:40:22.561: D/Statistic Fragment(5007): [updateFirstField] spinDate position : 0
01-03 08:40:22.561: D/Statistic Fragment(5007): [updateFragments]
I set position of spinner to 1
01-03 08:40:38.209: D/Statistic Fragment(5007): [onCreateView] spinDate onItemSelected
01-03 08:40:38.209: D/Statistic Fragment(5007): [updateFirstField] spinDate position : 1
01-03 08:40:38.209: D/Statistic Fragment(5007): [updateFragments]
On Configuration Changed again and see onItemSelected twice!
01-03 08:40:42.937: D/Statistic Fragment(5007): [onSaveInstanceState]
01-03 08:40:42.957: D/Statistic Fragment(5007): [onCreateView]
01-03 08:40:42.961: D/Statistic Fragment(5007): [onCreateView] savedInstanceState is not null and configuration has changed
01-03 08:40:43.449: D/Statistic Fragment(5007): [onCreateView] spinDate onItemSelected
01-03 08:40:43.449: D/Statistic Fragment(5007): [updateFirstField] spinDate position : 1
01-03 08:40:43.449: D/Statistic Fragment(5007): [updateFragments]
01-03 08:40:43.449: D/Statistic Fragment(5007): [onCreateView] spinDate onItemSelected
01-03 08:40:43.453: D/Statistic Fragment(5007): [updateFirstField] spinDate position : 1
01-03 08:40:43.453: D/Statistic Fragment(5007): [updateFragments]
I don't understand why onItemSelected is called twice when the position of spinner is not 0. I have to show dialog on selected item case 3, so when the orientation changed the dialog would show up again, how to prevent spinner got selected on orientation changed?