ViewGroup,Spinner——开源项目Standup Timer学习总结(五)

通过GroupView来实现length of metting 不同选择方式。

在设置中勾选variable metting length 时,会议时长可以设定为多变的长度(即任意长度),当不勾选时,只提供默认的选择,包括5、10、15、20 min。前者是用一个EditText来显示,后者是用Spinner。



具体是怎实现这种变化的呢。下面详细道来。

一、onResume()中初始化显示界面

   protected void onResume() {
        super.onResume();
        initializeGUIElements(); //初始化界面。
    }

二、定义了一个初始化界面函数initializeGUIElements(),每次刷新界面组件的时候,都会调用这个初始化函数。

private void initializeGUIElements() { //初始化界面
        loadState(); 
        initializeNumberOfParticipants();
        initializeMeetingLength();
        initializeTeamNamesSpinner();
        initializeStartButton();
    }

这个初始化函数,不只是初始化了可见界面组件,还对必要的数据进行了刷新,在loadState()里面实现,这里我们不去详细讲解这个,知道它的作用就行了。

我们所要关注的是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)。布局文件如下,其中我们只需要关注
<LinearLayout
            android:id="@+id/meeting_length_container"
……


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/number_of_participants"
            android:textSize="17sp" />

        <EditText
            android:id="@+id/num_participants"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="5dp"
            android:digits="0123456789"
            android:gravity="center"
            android:inputType="phone"
            android:lines="1" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:paddingTop="20dp"
            android:text="@string/length_of_meeting"
            android:textSize="17sp" />

        <LinearLayout
            android:id="@+id/meeting_length_container"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="100dp"
            android:layout_marginRight="100dp"
            android:layout_marginTop="5dp"
            android:gravity="center" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:paddingTop="20dp"
            android:text="@string/team"
            android:textSize="17sp" />

        <Spinner
            android:id="@+id/team_names"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="70dp"
            android:layout_marginRight="70dp"
            android:layout_marginTop="5dp"
            android:prompt="@string/team" />

        <Button
            android:id="@+id/start_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/start"
            android:width="80dp" />
    </LinearLayout>

</LinearLayout>

我们还需要了解是如何获取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中每一个选项的布局文件:

<resources>
   <string-array name="meeting_lengths">
      <item>@string/five_min</item>
      <item>@string/ten_min</item>
      <item>@string/fifteen_min</item>
      <item>@string/twenty_min</item>
   </string-array>
</resources>


到这里基本清楚了,收笔!





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值