对用户数据进行加载的函数为:
protected void loadState() {
SharedPreferences preferences = getPreferences(MODE_PRIVATE);
meetingLength = preferences.getInt(MEETING_LENGTH, 5);
numParticipants = preferences.getInt(NUMBER_OF_PARTICIPANTS, 2);
teamNamesPos = preferences.getInt(TEAM_NAMES_POS, 0);
}
对用户数据进行保存的函数为:private void saveState() {
SharedPreferences.Editor preferences = getPreferences(MODE_PRIVATE).edit();
preferences.putInt(MEETING_LENGTH, meetingLength);
preferences.putInt(NUMBER_OF_PARTICIPANTS, numParticipants);
preferences.putInt(TEAM_NAMES_POS, teamNamesPos);
preferences.commit();
}
对用户数据进行保存和加载完成后,在业务流程中就可以对数据进行操作,standupTimer项目在初始化UI的时候对数据进行加载,在通过button按钮触发会议计时以后对用户界面数据进行保存。这里似乎有一个bug,就是用户设置好数据以后,并没有触发会议计时而是切换到其他App应用,当Android内存不足的时候系统将standupTimer项目清理掉,此时用户设置的数据就没有得到保存,所以我觉得应该在onPause()函数中对数据进行保存在,这样当standupTimer项目项目切换到后台或者被意外销毁,都会对用户设置的数据进行了保存。为了不影响项目原有的逻辑,可以增加updateState()方法,对成员变量进行更新,然后在onPause()方法中对updateState()方法方法进行调用;
protected void onPause() {
updateState();
saveState();
super.onPause();
}
private void updateState(){
meetingLength = getMeetingLengthFromUI();
TextView t = (TextView) findViewById(R.id.num_participants);
numParticipants = parseNumberOfParticipants(t);
Spinner teamNameSpinner = (Spinner) findViewById(R.id.team_names);
teamNamesPos = teamNameSpinner.getSelectedItemPosition();
}
附源码中一个小小的bug:
standupTimer项目在对UI进行初始化的时候,有如下方法:
private void initializeNumberOfParticipants() {
TextView t = (TextView) findViewById(R.id.num_participants);
t.setText(Integer.toString(numParticipants));
}
其中num_participants资源是EditView类型,源码使用TextView进行强转,虽然两者都是View类型对象,强转不会出现什么问题,但是还是最好不要这么做。另外对EditView进行初始化时候,最好将光标位置设置到文本末尾,这样更方便用户输入。以上方法修改如下:private void initializeNumberOfParticipants() {
EditText t = (EditText) findViewById(R.id.num_participants);
t.setText(Integer.toString(numParticipants));
t.setSelection(Integer.toString(numParticipants).length());
}