1、开发一个名为CriminalIntent的应用。该应用可详细记录在办公室的陋习,该记录包括标题、日期和照片,以及支持在联系人中查找当事人。
2、引入fragment来管理应用UI,gragment是一种控制器对象,activity可以委派它执行任务,这些任务通常是管理用户界面,这种管理用户界面的fragment即为UI fragment。
3、使用fragment需要AppCompat,项目需要将其列入依赖关系
compile 'com.android.support:appcompat-v7:25.3.0'
4、创建Crime类
public class Crime {
private UUID mId;
private String mTitle;
private Date mDate;
private boolean mSolved;
public Crime() {
mId = UUID.randomUUID();
mDate = new Date();
}
}
5、已生成getter()与setter方法
public UUID getId() {
return mId;
}
public String getTitle() {
return mTitle;
}
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;
}
6、托管UI fragment
为托管UI fragment,activity必须1)在其布局中为fragment的视图安排位置;2)管理fragment实例的生命周期。
托管的两种方式:
1)在activity布局中添加fragment;
2)在activity代码中添加fragment;
创建fragment容器布局
<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" />
7、创建UI fragment 创建方法与创建activity相同
1)定义用户界面布局文件
2)创建fragment类并设置其视图为定义的布局
3)编写代码以实例化组件
(1)添加字符串资源
<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>
(2)fragment视图的布局文件
android:layout_margin="16dp"
<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"/>
(3)创建CrimeFragment类
继承Fragment类
public class CrimeFragment extends Fragment {}
导入支持库版Fragment
package com.bignerdranch.android.criminalintent;
import android.support.v4.app.Fragment;
覆盖Fragment.onCreate(Bundle)
private Crime mCrime;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCrime = new Crime();
}
覆盖onCreateView()方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime, container, false);
return v;
}
生成并使用EditText组件
private EditText mTitleField;
mTitleField = (EditText) v.findViewById(R.id.crime_title);
mTitleField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mCrime.setTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
设置Button文字
private Button mDateButton;
mDateButton = (Button) v.findViewById(R.id.crime_date);
mDateButton.setText(mCrime.getDate().toString());
mDateButton.setEnabled(false);
监听CheckBox的变化
private CheckBox mSolvedCheckbox;
mSolvedCheckbox = (CheckBox) v.findViewById(R.id.crime_solved);
mSolvedCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
mCrime.setSolved(isChecked);
}
});
8、向FragmentManager添加UI fragment
FragmentManager类具体管理:fragment队列和fragment事务回退栈
获取FragmentManager
FragmentManager fm = getSupportFragmentManager();
添加一个CrimeFragment
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null) {
fragment = new CrimeFragment();
fm.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}