8 Creating User Interfaces with Layouts and Widgets
In this chapter, you will learn more about layouts and widgets while adding a crimersquo;s date and status to CriminalIntent.
Upgrading Crime
Open Crime.java and add two new fields. The Date field represents the date a crime occurred. The boolean field represents whether the crime has been solved.
Listing 8.1 Adding more fields to Crime (Crime.java)
public class Crime { private UUID mId; private String mTitle; private Date mDate; private booleanmSolved;
public Crime() { mId = UUID.randomUUID(); mDate = new Date(); }
...
}
Initializing the Date variable using the default Date constructor sets mDate to the current date. This will be the default date for a crime.
Next, generate getters and setters for your new fields (Source → GenerateGettersandSetters...).
Listing 8.2 Generated getters and setters (Crime.java)
public class Crime { ...
public void setTitle(String title) {
mTitle = title; }
public Date getDate() { return mDate;
}
public void setDate(Date date) {
mDate = date; }
publicbooleanisSolved() { return mSolved;
}
public void setSolved(boolean solved) {
mSolved = solved;
}
}
Your next steps are updating the layout in fragment_crime.xml with new widgets and wiring up those widgets in CrimeFragment.java.
Updating the Layout
Here is what CrimeFragmentrsquo;s view will look like by the end of this chapter.
Figure 8.1 CriminalIntent, episode 2
Updating the Layout
To get this on screen, you are going to add four widgets to CrimeFragmentrsquo;s layout: two TextViewwidgets, a Button, and a CheckBox.
Open fragment_crime.xml and make the changes shown in Listing 8.3. You may get errors from missing string resources that you will create in a moment.
Listing 8.3 Adding new widgets (fragment_crime.xml)
lt;?xml version='1.0' encoding='utf-8'?gt;
lt;LinearLayoutxmlns:android='http://schemas.android.com/apk/res/android'
android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='vertical'
gt;
lt;TextView
android:layout_width='match_parent' android:layout_height='wrap_content' android:text='@string/crime_title_label' style='?android:listSeparatorTextViewStyle'
/gt;
lt;EditTextandroid:id='@ id/crime_title' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_marginLeft='16dp' android:layout_marginRight='16dp' android:hint='@string/crime_title_hint'
/gt;
lt;TextView
android:layout_width='match_parent' android:layout_height='wrap_content' android:text='@string/crime_details_label' style='?android:listSeparatorTextViewStyle'
/gt;
lt;Button android:id='@ id/crime_date' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_marginLeft='16dp' android:layout_marginRight='16dp'
/gt;
lt;CheckBoxandroid:id='@ id/crime_solved' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_marginLeft='16dp' android:layout_marginRight='16dp' android:text='@string/crime_solved_label'
/gt;
lt;/LinearLayoutgt;
Notice that you did not give the Button an android:text attribute. This button will display the date of the Crime being displayed, and its text will be set in code.
Why display the date on a Button? You are preparing for the future. For now, a crimersquo;s date defaults to the current date and cannot be changed. In Chapter 12, you will wire up the button so that a click presents a DatePicker widget from which the user can set the date to something else.
There are some new things in this layout to discuss, such as the style attribute and the margin attributes. But first letrsquo;s get CriminalIntent up and running with the new widgets.
Return to res/values/strings.xml and add the necessary string resources.
Listing 8.4 Adding string resources (strings.xml)
lt;resourcesgt;
lt;string name='app_name'gt;CriminalIntentlt;/stringgt;
lt;string name='title_activity_crime'gt;CrimeActivitylt;/stringgt;
lt;string name='crime_title_hint'gt;Enter a title for this crime.lt;/stringgt;
lt;string name='crime_title_label'gt;Titlelt;/stringgt;
lt;string name='crime_details_label'gt;Detailslt;/stringgt;
lt;string name='crime_solved_label'gt;Solved?lt;/stringgt;
lt;/resourcesgt;
Save your files and check for typos.
Wiring Widgets
The CheckBox needs to display whether a Crime has been solved. You also need to update the Crimersquo;s mSolved field when a user toggles the CheckBox.
For now, all the new Button needs to do is display the date in the Crimersquo;s mDate field.
In CrimeFragment.java, add two new instance variables.
Listing 8.5 Adding widget instance variables (CrimeFragment.java)
public class CrimeFragment ext
剩余内容已隐藏,支付完成后下载完整资料
第八章 使用布局与组建创建用户界面
本章,在为CriminalIntent应用添加crime记录时间及处理状态的过程中,我们将学习到更多有 关布局和组件的知识。
8.1 升级Crime 类
打开Crime.java文件,新增两个实例变量。Date变量表示crime发生的时间,Boolean变量表 示crime是否已得到处理,如代码清单8-1所示。
代码清单8-1 添加更多变量到Crime(Crime.java)
public class Crime { private UUID mId; private String mTitle; private Date mDate; private boolean mSolved;
public Crime() { mId = UUID.randomUUID(); mDate = new Date(); }
...
}
使用默认的Date构造方法初始化Data变量,设置mDate变量值为当前日期。该日期将作为 crime默认的发生时间。
接下来,为新增变量生成getter与setter方法(选择Source → Generate Getters and Setters...菜单 项),如代码清单8-2所示。
代码清单8-2 已产生的getter与setter方法(Crime.java)
public class Crime { ...
public void setTitle(String title) {
mTitle = title; }
public Date getDate() { return mDate;
}
public void setDate(Date date) {
mDate = date; }
public boolean isSolved() { return mSolved;
}
public void setSolved(boolean solved) {
mSolved = solved;
}
}
接下来,使用新组件更新fragment_crime.xml文件中的布局,然后在CrimeFragment.java文件 中生成并使用这些组件。
8.2 更新布局
本章结束时,完成后的CrimeFragment视图应如图8-1所示。
图8-1 CriminalIntent应用界面(本章完成部分)
要得到图8-1所示的用户界面,还需为CrimeFragment的布局添加四个组件,即两个 TextView组件、一个Button组件以及一个CheckBox组件。
打开fragment_crime.xml文件,如代码清单8-3所示添加四个组件的定义。可能会出现缺少字 符串资源的错误提示,我们稍后会创建这些字符串资源。
代码清单8-3 添加新组件(fragment_crime.xml)
lt;?xml version='1.0' encoding='utf-8'?gt;
lt;LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='vertical'
gt;
lt;TextView
android:layout_width='match_parent' android:layout_height='wrap_content' android:text='@string/crime_title_label' style='?android:listSeparatorTextViewStyle'
/gt;
lt;EditText android:id='@ id/crime_title' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_marginLeft='16dp' android:layout_marginRight='16dp' android:hint='@string/crime_title_hint'
/gt;
lt;TextView
android:layout_width='match_parent' android:layout_height='wrap_content' android:text='@string/crime_details_label' style='?android:listSeparatorTextViewStyle'
/gt;
lt;Button android:id='@ id/crime_date' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_marginLeft='16dp' android:layout_marginRight='16dp'
/gt;
lt;CheckBox android:id='@ id/crime_solved' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_marginLeft='16dp' android:layout_marginRight='16dp' android:text='@string/crime_solved_label'
/gt;
lt;/LinearLayoutgt;
注意,Button组件定义中没有android:text属性。该按钮将用于显示Crime的发生日期, 显示的日期文字内容将通过代码的方式进行设置。
为什么要在Button上显示日期呢?这是在为应用的后续开发做准备。目前,crime的发生日 期默认为当前日期且不可更改。第12章,我们将启用按钮组件,通过单击按钮弹出DatePicker 组件以供用户设置自定义日期。
布局定义中还有一些新的知识点可供探讨,如style及margin属性。不过首先还是先把添加了新组件的CriminalIntent运行起来吧。
回到res/values/strings.xml文件中,添加必需的字符串资源,如代码清单8-4所示。
代码清单8-4 添加字符串资源(strings.xml)
lt;resourcesgt;
lt;string name='app_name'gt;CriminalIntentlt;/stringgt;
lt;string name='title_activity_crime'gt;CrimeActivitylt;/stringgt;
lt;string name='crime_title_hint'gt;Enter a title for this crime.lt;/stringgt;
lt;string name='crime_title_label'gt;Titlelt;/stringgt;
lt;string name='crime_details_label'gt;Detailslt;/stringgt;
lt;string name='crime_solved_label'gt;Solved?lt;/stringgt;
lt;/resourcesgt;
保存修改过的文件,检查确认无拼写错误发生。
8.3 生成并使用组件
CheckBox需显示Crime是否已得到处理。用户勾选清除CheckBox时,Crime的mSolved变量 的状态值也需得到相应的更新。
目前,新增Button要做的就是显示Crime类中mDate变量的日期值。
在CrimeFragment.java中,新增两个实例变量,如代码清单8-5所示。
代码清单8-5 添加组件实例变量(CrimeFragment.java)
public class CrimeFragment extends Fragment {
private Crime mCrime; private EditText mTitleField; private Button mDateButton; private CheckBox mSolvedCheckBox;
@Override
public void onCreate(Bundle savedInstanceState) { ...
使用类包组织导入功能,完成CheckBox相关类包的导入。
接下来,在onCreateView(...)方法中,引用新添加的按钮,如代码清单8-6所示设置它的 文字属性值为crime的日期,然后暂时禁用灰掉它。
代码清单8-6 设置Button上的文字显示(CrimeFragment.java)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime, parent, false); ...
mTitleField.addTextChangedListener(new TextWatcher() {
...
});
mDateButton = (Button)v.findViewById(R.id.crime_date); mDateButton.setText(mCrime.getDate().toString()); mDateButton.setEnabled(false);
return v;
}
禁用按钮可以保证它不响应用户的单击事件。按钮禁用后,它的外观样式也会发生改变,以 此表明它已处于禁用状态。等到第12章我们设置监听器时,会再次启动该按钮。
下面要处理的是CheckBox组件,在代码中引用它并设置监听器用于更新Crime的mSolved变 量值,如代码清单8-7所示。
代码清单8-7 侦听CheckBox状态的变化(CrimeFragment.java)
... mDateButton = (Button)v.findViewById(R.id.crime_date); mDateButton.setText(mCrime.getDate().toString()); mDateButton.setEnabled(false);
mSolvedCheckBox = (CheckBox)v.
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[148746],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。