实验四 Android项目CriminalIntent应用开发二
2023-09-14 09:14:10 时间
参考文章:
第二个项目CriminalIntent应用开发阶段总结(一)(二)https://www.cnblogs.com/hj0407/
android编程权威指南第七章-CriminalIntent应用https://blog.csdn.net/weixin_43749381/article/details/107465847
一、项目创建
二、代码详情
1. values布局
(1)strings.xml
<resources>
<string name="app_name">学号+姓名</string>
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>
2. layout布局
(1)activity_crime_list.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_fragment_container"
tools:context=".CrimeListActivity">
</FrameLayout>
(2)fragment_crime.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Title" />
<EditText
android:id="@+id/crime_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:text="crime_title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Details" />
<Button
android:id="@+id/crime_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="Crime Date" />
<CheckBox
android:id="@+id/list_item_crime_solved"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="解决了" />
</LinearLayout>
(3)fragment_crime_list.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CrimeListFragment"
android:id="@+id/crime_recycleview">
</androidx.recyclerview.widget.RecyclerView>
(4)list_item_crime.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/list_item"
android:padding="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/list_item_crime_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题" />
<TextView
android:id="@+id/list_item_crime_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="日期" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<CheckBox
android:id="@+id/list_item_crime_solved"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="解决了" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
3. Java布局
(1)CrimeListActivity
public class CrimeListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_list);
//获取FragmentManager
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.list_fragment_container);
if (fragment == null) {
fragment = new CrimeListFragment();
fm.beginTransaction()
.add(R.id.list_fragment_container, fragment)
.commit();
}
}
}
(2)Crime
public class Crime implements Serializable {
private UUID mId;
private String mTitle;
private Date mDate;
private boolean mSolved;
public Crime() {
mId = UUID.randomUUID();
mDate = new Date();
}
public Crime(UUID mId, String mTitle, Date mDate, boolean mSolved) {
this.mId = mId;
this.mTitle = mTitle;
this.mDate = mDate;
this.mSolved = mSolved;
}
@Override
public String toString() {
return "Crime{" +
"mId=" + mId +
", mTitle='" + mTitle + '\'' +
", mDate=" + mDate +
", mSolved=" + mSolved +
'}';
}
public String getmTitle() {
return mTitle;
}
public void setmTitle(String mTitle) {
this.mTitle = mTitle;
}
public Date getmDate() {
return mDate;
}
public void setmDate(Date mDate) {
this.mDate = mDate;
}
public boolean ismSolved() {
return mSolved;
}
public void setmSolved(boolean mSolved) {
this.mSolved = mSolved;
}
public UUID getmId() {
return mId;
}
public void setmId(UUID mId) {
this.mId = mId;
}
}
(3)CrimeFragment
public class CrimeFragment extends Fragment {
private Crime crime;
private EditText crimeTitle;
private Button crimeDate;
private CheckBox crimeSolved;
public CrimeFragment() {
}
public static CrimeFragment newInstance(Crime crime) {
CrimeFragment fragment = new CrimeFragment();
Bundle args = new Bundle();
args.putSerializable("crime", crime);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
this.crime = (Crime) getArguments().getSerializable("crime");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime, container, false);
crimeTitle = v.findViewById(R.id.crime_title);
crimeTitle.setText(crime.getmTitle());
crimeTitle.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
crime.setmTitle(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
crimeDate = v.findViewById(R.id.crime_date);
crimeDate.setText(crime.getmDate().toString());
crimeDate.setEnabled(false);
crimeSolved = v.findViewById(R.id.list_item_crime_solved);
crimeSolved.setChecked(crime.ismSolved());
crimeSolved.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
crime.setmSolved(isChecked);
}
});
return v;
}
}
(4)CrimeListFragment
public class CrimeListFragment extends Fragment {
//为CrimeListFragment配置视图
private RecyclerView mRecyclerview;
private CrimeAdapter mCrimeAdapter;
public CrimeListFragment() {
// 需要空的公共构造函数
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime_list, container, false);
mRecyclerview = v.findViewById(R.id.crime_recycleview);
mRecyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));
CrimeLab crimeLab = CrimeLab.get(getActivity());
List<Crime> crimes = crimeLab.getCrimes();
mCrimeAdapter = new CrimeAdapter(crimes);
mRecyclerview.setAdapter(mCrimeAdapter);
return v;
}
//创建Adapter内部类
private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {
private List<Crime> crimes;
public CrimeAdapter(List<Crime> crimes) {
this.crimes = crimes;
}
//武装CrimeAdapter
@NonNull
@Override
public CrimeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
return new CrimeHolder(layoutInflater, parent);
}
//调用bind(Crime)方法
@NonNull
@Override
public void onBindViewHolder(@NonNull CrimeHolder holder, int position) {
Crime crime = crimes.get(position);
holder.bind(crime);
}
@Override
public int getItemCount() {
return crimes.size();
}
}
//定义ViewHolder内部类
private class CrimeHolder extends RecyclerView.ViewHolder {
private TextView mTitle;
private TextView mDate;
private CheckBox mCheckBox;
private Crime mCrime;
public CrimeHolder(LayoutInflater inflater, ViewGroup container) {
super(inflater.inflate(R.layout.list_item_crime, container, false));
mTitle = itemView.findViewById(R.id.list_item_crime_title);
mDate = itemView.findViewById(R.id.list_item_crime_date);
mCheckBox = itemView.findViewById(R.id.list_item_crime_solved);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CrimeFragment crimeFragment = CrimeFragment.newInstance(mCrime);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.list_fragment_container, crimeFragment)
.commit();
transaction.addToBackStack(null);
Toast.makeText(getActivity(), mCrime.getmId() + "clicked", Toast.LENGTH_SHORT).show();
}
});
}
//将crime显示在布局上
public void bind(Crime crime) {
mCrime = crime;
mTitle.setText(crime.getmTitle());
mDate.setText(crime.getmDate().toString());
mCheckBox.setChecked(crime.ismSolved());
}
}
}
(5)CrimeLab
//单实例类
public class CrimeLab {
//保存该类的唯一实例
private static CrimeLab sCrimeLab;
//保存多个Crime的List容器
private List<Crime> mCrimes;
//暴露给外部的静态方法,生成或获取该类的唯一实例sCrimeLab
public static CrimeLab get(Context context) {
//确保实例的唯一性
if (sCrimeLab == null)
sCrimeLab = new CrimeLab(context);
return sCrimeLab;
}
//私有构造函数,使得外部无法new出该对象的实例
private CrimeLab(Context context) {
//实例化容器成员
mCrimes = new ArrayList<>();
//初始化100个crime表项
for (int i = 0; i < 100; i++) {
Crime crime = new Crime();
crime.setmTitle("Crime #" + i);
crime.setmSolved(i % 2 == 0);
mCrimes.add(crime);
}
}
public List<Crime> getCrimes() {
return mCrimes;
}
//根据UUID查找对应的crime表项
public Crime getCrime(UUID id) {
for (Crime crime : mCrimes) {
if (crime.getmId().equals(id))
return crime;
}
return null;
}
}
三、效果展示
相关文章
- Android浏览器的插件渲染模式简介
- strictmode android,Android 应用性能优化-StrictMode(严格模式)
- Android View 深度分析requestLayout、invalidate与postInvalidate「建议收藏」
- Delphi Android ActivityManager
- 以爬虫工程师身份谈谈Android端的信息安全
- 【Android 应用开发】 FastJson 使用详解
- 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)
- 【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )
- 【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )
- 【Android Gradle 插件】ProductFlavor 配置 ( applicationId 配置 | SdkVersion 相关配置 | version 应用版本配置 )
- 【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
- 【Unity3D】Android 打包 ③ ( Android 工程设置 | 打包 Apk 安装文件 | 配置项细节 | 运行效果 )
- Android Volley网络通信框架的使用(一):Volley的简单用法详解手机开发
- 谈谈 23 种设计模式在 Android 项目中的应用详解手机开发
- Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件详解手机开发
- Android侧滑删除另一种实现,SwipeListView补充详解手机开发
- Android中android:visibility的3中属性的剖析详解手机开发
- 谷歌推出Android 12 Beta 3带来最终版本的API 同时原生支持长截图功能
- 超过7000款恶意软件通过Android第三方应用商店传播
- Android实现PHP连接MySQL进行数据交互(android通过php连接mysql)
- android自定义Android菜单背景的代码
- Android控件之EditView常用属性及应用方法
- android定时启动取消小例子
- android检查手机和无线是否连接的方法