通过GroupView来实现length of metting 不同选择方式。
在设置中勾选variable metting length 时,会议时长可以设定为多变的长度(即任意长度),当不勾选时,只提供默认的选择,包括5、10、15、20 min。前者是用一个EditText来显示,后者是用Spinner。
那具体是怎实现这种变化的呢。下面详细道来。
一、onResume()中初始化显示界面
protected void onResume() {
super.onResume();
initializeGUIElements(); //初始化界面。
}
private void initializeGUIElements() { //初始化界面
loadState();
initializeNumberOfParticipants();
initializeMeetingLength();
initializeTeamNamesSpinner();
initializeStartButton();
}
我们所要关注的是initializeMettingLength(),在这个函数里根据设置里的variable metting length的选择情况,判断使用哪种显示方式来提供时长选择。
三、定义initailizeMettingLength():
removeAllViews():移除View容器中的所有view
addView(View v):向View容器中添加View
private void initializeMeetingLength() { //初始化时长
ViewGroup meetingLengthContainer = (ViewGroup) findViewById(R.id.meeting_length_container); //生成一个 View容器
meetingLengthContainer.removeAllViews(); //移除View容器中的所有view
View meetingLengthView = null;
if (Prefs.allowVariableMeetingLength(this)) { //判断选取那种组件进行显示
meetingLengthView = createMeetingLengthTextBox(); //设置时间长短为任意值,显示的是EditText
} else {
meetingLengthView = createMeetingLengthSpinner(); //设置时间长度为预设置的值,显示的是Spinner
}
meetingLengthContainer.addView(meetingLengthView); //向View容器中添加View
}
ViewGroup meetingLengthContainer = (ViewGroup) findViewById(R.id.meeting_length_container); //生成一个 View容器
在布局文件中获取这个View容器,用于装载显示时长所需要的控件(EditText/Spinner)。布局文件如下,其中我们只需要关注
……
我们还需要了解是如何获取variable metting length的设置状态的。Prefs.allowVariableMeetingLength(this)实现了这个功能。
四、定义Prefs以及其中的修改和获取设置状态的方法。Prefs继承了PreferenceActivity,是用于保存和修改各种设置状态的,这种数据的保存具有持久性。SharedPreferences我们之前已经学习过了,也是用于保存持久性的数据。这里学习如何使用PreferenceActivity达到同样的效果。
public class Prefs extends PreferenceActivity {
private static final String SOUNDS = "sounds";
private static final boolean SOUNDS_DEFAULT = true;
private static final String WARNING_TIME = "warning_time";
private static final int WARNING_TIME_DEFAULT = 15;
private static final String UNLIMITED_PARTICIPANTS = "unlimited_participants";
private static final boolean UNLIMITED_PARTICIPANTS_DEFAULT = false;
private static final String VARIABLE_MEETING_LENGTH = "variable_meeting_length";
private static final boolean VARIABLE_MEETING_LENGTH_DEFAULT = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
public static boolean playSounds(Context context) {//获取PlaySounds设置的状态值
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SOUNDS, SOUNDS_DEFAULT);
}
public static void setPlaySounds(Context context, boolean value) {//修改PlaySounds设置。并保存。
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(SOUNDS, value).commit();
}
public static int getWarningTime(Context context) {
String value = PreferenceManager.getDefaultSharedPreferences(context).getString(WARNING_TIME, Integer.toString(WARNING_TIME_DEFAULT));
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
setWarningTime(context, WARNING_TIME_DEFAULT);
return WARNING_TIME_DEFAULT;
}
}
public static void setWarningTime(Context context, int warningTime) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putString(WARNING_TIME, Integer.toString(warningTime)).commit();
}
public static boolean allowUnlimitedParticipants(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(UNLIMITED_PARTICIPANTS, UNLIMITED_PARTICIPANTS_DEFAULT);
}
public static void setAllowUnlimitedParticipants(Context context, boolean value) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(UNLIMITED_PARTICIPANTS, value).commit();
}
public static boolean allowVariableMeetingLength(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(VARIABLE_MEETING_LENGTH, VARIABLE_MEETING_LENGTH_DEFAULT);
}
public static void setAllowVariableMeetingLength(Context context, boolean value) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(VARIABLE_MEETING_LENGTH, value).commit();
}
}
五、接下来了解这两个方法:
1、 createMeetingLengthTextBox()
2、 createMeetingLengthSpinner():通过这个方法可以学习创建和配置Spinner
private View createMeetingLengthTextBox() { //创建时长输入编辑框
meetingLengthEditText = new EditText(this);
meetingLengthEditText.setGravity(Gravity.CENTER);
meetingLengthEditText.setKeyListener(new DigitsKeyListener());
meetingLengthEditText.setRawInputType(InputType.TYPE_CLASS_PHONE);
meetingLengthEditText.setLayoutParams(new LayoutParams(dipsToPixels(60), LayoutParams.WRAP_CONTENT));
meetingLengthEditText.setText(Integer.toString(meetingLength));
meetingLengthEditText.setLines(1);
meetingLengthSpinner = null;
return meetingLengthEditText;
}
private View createMeetingLengthSpinner() { //创建时长选择Spinner
meetingLengthSpinner = new Spinner(this);
meetingLengthSpinner.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));//设置布局参数
meetingLengthSpinner.setPrompt(this.getString(R.string.length_of_meeting)); //设置对话框提示标题
ArrayAdapter> adapter = ArrayAdapter.createFromResource(this, R.array.meeting_lengths,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
meetingLengthSpinner.setAdapter(adapter);
meetingLengthSpinner.setSelection(getSpinnerPositionFromMeetingLength(meetingLength));
meetingLengthEditText = null;
return meetingLengthSpinner;
}
其中, android.R.layout.simple_spinner_item是系统的默认布局文件。
Spinner中每一个选项的布局文件:
- @string/five_min
- @string/ten_min
- @string/fifteen_min
- @string/twenty_min