学习记录6

Android Studio 第 6 天学习记录

一、学习内容

(一)自定义控件的进阶

• 自定义 View 的高级特性

• 学习了如何在自定义 View 中实现复杂的绘制效果,例如渐变色、阴影和动画。

• 通过Paint类的setShader方法,为自定义 View 添加了渐变色背景。例如,使用LinearGradient实现从上到下的颜色渐变。

• 掌握了如何使用setLayerTypesetShadowLayer方法为自定义 View 添加阴影效果,增强界面的立体感。

• 实践了简单的动画效果,通过ObjectAnimator对自定义 View 的属性(如translationXtranslationY)进行动画操作,实现平移动画。

• 自定义属性的高级应用

• 学习了如何在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 卡)。

• 掌握了如何通过FileOutputStreamFileInputStream读写文件,并理解了文件存储的路径和权限问题。

• 实践了一个简单的文本编辑器应用,用户可以保存和读取文本文件。

二、实践操作

(一)自定义渐变按钮控件

• 定义自定义属性

• 在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`数据库存储结构化数据。同时,我也会尝试将所学知识整合到一个更复杂的应用项目中,提升自己的开发能力。
posted @ 2025-04-11 16:23  马瑞鑫03  阅读(25)  评论(1)    收藏  举报