Android Studio(三)CriminalIntent—1.界面设计、2.显示列表
Android编程权威指南 第3版 第7、8章 学习总结
代码来源于《Android编程权威指南》第三版
14-4F-8A-A2-D1-90 60 3
14-4F-8A-A2-D1-90 60 4
CriminalIntent可用于详细记载办公室内的陋习,记录包括标题、日期和照片,支持在联系人中查找当事人,通过E-mail、twitter、Facebook或其他应用提出抗议。
一、记录明细界面设计
首先设计一个名为CrimeFragment的UI fragment来管理用户界面,再设计-一个名
为CrimeActivity的activity来托管CrimeF ragment实例。
可以这样理解托管: activity在其视图层级里提供- -处位置, 用来放置fragment视图,如下图所示。fragment本身没有在屏幕上显示视图的能力。因此,只有将它的视图放置在activity的视图层级结构中,fragment视图才 能显示在屏幕上。
Crime、CrimeFragment以及CrimeActivity是我们要开发的三个类。
CrimeActivity视图由FrameLayout组件组成,FrameLayout组件为CrimeFragment视图安排了显示位置。CrimeFragment视图由一个LinearLayout组件及其三个子视图组成。这三个子视图包括一个EditText组件、一个Button组件和一个CheckBox组件。CrimeFragment类中有存储它们的成员变量,并设有监听器,会响应用户操作时,更新模型层数据。
新建项目就不特别说明了,与之前GeoQuiz的新建相同,不清楚的可以看一下前一个博客。
添加依赖项
本文使用的Android Studio 4.1.1 Sdk 30已自动添加该项目所需要的依赖项,可省略此步骤,其他版本可以打开app/build.gradle文件,SDK 28及以下版本的看是否有这一行代码,没有就加上,然后进行同步。
compile 'com.android.support:appcompat-v7:25.0.3'//25.0.3为buildTools版本号
SDK 28以上版本的看是否有这一行代码,同样没有就加上,然后进行同步。
implementation 'androidx.appcompat:appcompat:1.2.0'
依赖项添加好后右键MainActivity,将其更名为CrimeActivity,并将其超类改为AppCompatActivity
创建Crime类
在包内新建一个Java Class,命名为Crime,单击OK,并为其添加如下代码
public class Crime {
private UUID mId;
private String mTitle;
private Date mDate;
private boolean mSolved;
public Crime() {
mId = UUID.randomUUID();
mDate = new Date();
}
UUID是Android框架里的Java工具类。有了它,产生唯- -ID值就方便多了。在构造方法里,调用UUID. randomUUID()产生一个随机唯一ID值。在导入Data类时选择java.utill.Data类。
配置Android Studio识别成员变量的m前缀,打开Android Studio首选项对话框( Mac用户选择Android Studio菜单, Windows用户选择File→Settings菜单)。依次展开Editor和ICode Style选项,在Java选项下选择Code Generation选项页。在Naming表单的Field- -行中, 添加m作为前缀,然后添加s作为Static field的前缀。
接下来,为只读成员变量mId生成一个gtter方法, 为成员变量mTitle. mDate和mSolved生成getter方法和setter方法。右键单击构造方法下面的空白处,选择Generate… →Getter菜单项,然后选择mId变量。再选择Generea… →Getter and Setter为变量mTitle. mDate 和mSolved生成getter方法和setter方法
生成好后,如下图所示
UI Fragment
为托管UI fragment, activity必须 :
1.在其布局中为fragment的视图安排位置;
2.管理fragment实例的生命周期。
托管有两种方式:
1.在activity布局中添加fragment;
2.在activity代码中添加fragment。
我们选择跟为灵活的第二种:
1.首先定义CrimeActivity的布局,打开res/layout/activity_crime.xml
更换默认布局,代码如下
<FrameLayout android:id="@+id/fragment_container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.打开res/values/strings.xml,添加需要的字符串资源
<resources>
<string name="app_name">CriminalIntent</string>
<string name="crime_title_hint">Enter a title for the crime.</string>
<string name="crime_title_label">Title</string>
<string name="crime_details_label">Details</string>
<string name="crime_solved_label">Solved</string>
</resources>
3.然后是定义用户界面。CrimeFragment的视图布 局包含一个垂直LinearLayout组件,这个组件又含有5个子组件:两个TextView组件、一个EditText组件、一个Button组件和一个CheckBox组件。要创建布局文件,在项目工具窗口中,右键单击res/layout.文件夹,选择New→Layout resource file菜单项。命名布局文件为fragment.crime.xml。 输人LinearLayout作为根元素节点后,单击OK按钮完成创建。
新建文件打开后,查看XML,会发现向导已经添加了LinearLayout。手动添加其余组件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
android:orientation="vertical">
<TextView
style="?android:listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_title_label"/>
<EditText
android:id="@+id/crime_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/crime_title_hint"/>
<TextView
style="?android:listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_details_label"/>
<Button
android:id="@+id/crime_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/crime_solved"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_solved_label"/>
</LinearLayout>
4.创建CrimeFragment类
在包内创建一个新的Java Class,命名为CrimeFragment,点击OK完成创建。修改代码,添加继承类Fragment。并导入支持库版的类
import android.support.v4.app.Fragment;//28版本以下
import androidx.fragment.app.Fragment;//28版本以上
为其创建一个新的crime
private</