学习记录6
Android Studio 第 6 天学习记录
一、学习内容
(一)自定义控件的进阶
• 自定义 View 的高级特性
• 学习了如何在自定义 View 中实现复杂的绘制效果,例如渐变色、阴影和动画。
• 通过Paint类的setShader方法,为自定义 View 添加了渐变色背景。例如,使用LinearGradient实现从上到下的颜色渐变。
• 掌握了如何使用setLayerType和setShadowLayer方法为自定义 View 添加阴影效果,增强界面的立体感。
• 实践了简单的动画效果,通过ObjectAnimator对自定义 View 的属性(如translationX、translationY)进行动画操作,实现平移动画。
• 自定义属性的高级应用
• 学习了如何在attrs.xml中定义更复杂的自定义属性,例如使用enum类型定义属性值的枚举选项,以及使用flag类型定义属性的组合选项。
• 通过TypedArray在自定义 View 的构造方法中获取自定义属性的值,并根据这些值动态调整 View 的显示效果。
• 实践了一个带有自定义渐变色和阴影效果的按钮控件,通过自定义属性在布局文件中灵活配置渐变色的方向和阴影的大小。
(二)Fragment 的高级应用
• Fragment 的嵌套
• 学习了如何在 Fragment 中嵌套其他 Fragment,并理解了嵌套 Fragment 的生命周期和事务管理。
• 实践了一个包含两级 Fragment 的应用:主 Fragment 中通过按钮点击动态切换子 Fragment 的内容。通过getChildFragmentManager获取子 Fragment 的FragmentManager,从而管理子 Fragment 的事务。
• 确保在嵌套 Fragment 的场景下,数据传递和状态保存的正确性。
• Fragment 的交互
• 学习了 Fragment 之间如何进行数据传递和交互。通过定义接口(Interface)的方式,让 Fragment 与 Activity 之间进行通信,再由 Activity 将数据传递到其他 Fragment。
• 实践了一个简单的新闻应用:一个 Fragment 显示新闻列表,另一个 Fragment 显示新闻详情。当用户点击新闻列表中的某一项时,通过接口将新闻数据传递到详情 Fragment 中显示。
(三)数据存储基础
• SharedPreferences 的使用
• 学习了SharedPreferences的基本概念和使用方法,用于存储简单的键值对数据。
• 掌握了如何通过SharedPreferences.Editor保存数据,以及如何通过SharedPreferences获取存储的数据。
• 实践了一个简单的用户设置界面,通过SharedPreferences保存用户的设置选项(如主题颜色、字体大小等),并在应用启动时加载这些设置。
• 文件存储
• 学习了如何在 Android 中使用文件存储数据,包括内部存储和外部存储(如 SD 卡)。
• 掌握了如何通过FileOutputStream和FileInputStream读写文件,并理解了文件存储的路径和权限问题。
• 实践了一个简单的文本编辑器应用,用户可以保存和读取文本文件。
二、实践操作
(一)自定义渐变按钮控件
• 定义自定义属性
• 在res/values/attrs.xml中定义了渐变色的起始颜色、结束颜色和方向等属性,以及阴影的大小和颜色属性。
<declare-styleable name="GradientButton">
<attr name="startColor" format="color"/>
<attr name="endColor" format="color"/>
<attr name="direction" format="enum">
<enum name="top_bottom" value="0"/>
<enum name="left_right" value="1"/>
</attr>
<attr name="shadowSize" format="dimension"/>
<attr name="shadowColor" format="color"/>
</declare-styleable>
```
• 实现自定义 View
• 在自定义 View 的构造方法中,通过`TypedArray`获取自定义属性的值。
• 在`onDraw`方法中,使用`Paint`和`LinearGradient`实现渐变色背景,通过`setShadowLayer`添加阴影效果。
• 在布局文件中使用该自定义控件,并通过自定义属性动态配置按钮的样式。
(二)新闻应用的 Fragment 交互
• 定义交互接口
• 在新闻列表 Fragment 中定义了一个接口`OnNewsItemClickListener`,用于将新闻数据传递到 Activity。
```java
public interface OnNewsItemClickListener {
void onNewsItemClicked(NewsItem newsItem);
}
```
• 在`onAttach`方法中,将 Activity 强制转换为接口实例,并保存为成员变量。
```java
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnNewsItemClickListener) {
mListener = (OnNewsItemClickListener) context;
} else {
throw new RuntimeException(context.toString() + " must implement OnNewsItemClickListener");
}
}
```
• 数据传递
• 当用户点击新闻列表中的某一项时,通过接口将新闻数据传递到 Activity,再由 Activity 将数据传递到新闻详情 Fragment 中。
```java
@Override
public void onNewsItemClicked(NewsItem newsItem) {
NewsDetailFragment fragment = new NewsDetailFragment();
Bundle args = new Bundle();
args.putSerializable("news_item", newsItem);
fragment.setArguments(args);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();
}
```
(三)SharedPreferences 保存用户设置
• 保存设置
• 在用户设置界面中,通过`SharedPreferences.Editor`保存用户的设置选项。
```java
SharedPreferences sharedPreferences = getSharedPreferences("user_settings", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("theme_color", selectedThemeColor);
editor.putFloat("font_size", selectedFontSize);
editor.apply();
```
• 加载设置
• 在应用启动时,通过`SharedPreferences`加载用户的设置选项,并应用到界面中。
```java
SharedPreferences sharedPreferences = getSharedPreferences("user_settings", Context.MODE_PRIVATE);
int themeColor = sharedPreferences.getInt("theme_color", defaultThemeColor);
float fontSize = sharedPreferences.getFloat("font_size", defaultFontSize);
```
三、遇到的问题及解决方法
(一)问题:自定义 View 的渐变色方向不正确
• 原因:在`LinearGradient`的构造方法中,渐变方向的坐标设置错误。
• 解决方法:根据自定义属性中定义的方向,正确设置`LinearGradient`的起点和终点坐标。例如,对于从上到下的渐变方向,起点坐标为`(0, 0)`,终点坐标为`(0, height)`。
(二)问题:Fragment 交互时,接口未正确实现导致崩溃
• 原因:在 Fragment 的`onAttach`方法中,Activity 未正确实现接口,导致强制类型转换失败。
• 解决方法:确保 Activity 实现了 Fragment 中定义的接口,并在`onAttach`方法中正确保存接口实例。如果 Activity 未实现接口,则抛出异常提示开发者。
(三)问题:文件存储时,外部存储权限未开启导致无法写入文件
• 原因:在 Android 6.0 及以上版本中,需要动态申请外部存储权限。
• 解决方法:在应用中动态申请`WRITE_EXTERNAL_STORAGE`权限。通过`ActivityCompat.requestPermissions`方法申请权限,并在`onRequestPermissionsResult`方法中处理权限申请结果。
四、总结与展望
今天的学习重点是自定义控件的高级特性、Fragment 的高级应用以及数据存储的基础知识。通过理论学习和实践操作,我对这些知识点有了更深入的理解,并能够实现一些复杂的自定义控件和 Fragment 交互功能。同时,我也掌握了`SharedPreferences`和文件存储的基本用法,为后续学习数据库存储等更复杂的数据存储机制打下了基础。
接下来,我计划继续深入学习 Android 的网络请求和数据存储机制,例如使用`Retrofit`进行网络请求,以及使用`SQLite`数据库存储结构化数据。同时,我也会尝试将所学知识整合到一个更复杂的应用项目中,提升自己的开发能力。

浙公网安备 33010602011771号