新建布局文件和
创建布局
基础框架选择
创建模板之后,其他的都不用考虑了 使用默认模板作为框架
通过默认的框架将减少很多时间
项目如何运行起来的
通过Gradle
配置文件和脚本用来将所有的代码和资源进行打包。
你可以使用 Java、Kotlin语言 你可以创建活动(Activity)、布局文件(Layout)、资源文件(Resource)等。在这个阶段,你主要负责实现应用程序的功能和界面设计。
- 构建项目:当你完成了代码编写和设计后,你需要构建项目。在 Android Studio 中,它会使用 Gradle 构建系统来编译代码、处理依赖关系、生成 APK 文件等。Gradle 会根据你的配置和需求自动执行构建过程。
- 调试和测试:在构建项目后,你可以使用 Android Studio 提供的调试工具来调试应用程序。你可以设置断点、监视变量值、单步执行代码等,以便检查和修复潜在的问题。此外,你还可以编写单元测试和集成测试来验证应用程序的功能和正确性。
Android Studio 提供了一个运行配置(Run Configuration)来选择目标设备,并自动部署和启动应用程序。
启动NavigationDrawerViewsActivity提示Moudle重复
解决方法,在build.gradle(module.app)
中的dependencies
中最后一行添加以下代码
constraints {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
}
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
}
}
开发实践
安卓的一个Activity就代表着安卓应用的一个页面,每个页面都对应着layout.xml
文件用来保存这个页面的元素/及其布局,每个页面都有一个activity
类用来保存关于这个布局
生命周期和事件监听器
NavigationDrawerViewsActivity解析(Android视图树)
熟悉资源存放方法
提示(如果你没有Android视图,可能没有标记这个项目。常见于拉取项目,你可以尝试去点击构建MakeProject
,这是一个小锤子的标志)
这是项目树状图
app->
>mainfest
>Admainfest.xml
>java
>组名
>ui
>MainActivity
>res
>drawable
>layout
>mipmap
>values
GradleScripts
而关于这些文件夹
及其存放的内容
-
drawable
:该文件夹用于存储图形资源文件,例如图标、背景图、形状等。你可以将不同分辨率的图像放置在不同的子文件夹中,以适应不同的屏幕密度。 -
layout
:该文件夹用于存储布局文件,用于定义应用程序界面的视图层次结构。每个布局文件描述了一个屏幕上的视图布局,可以包含诸如按钮、文本框、图像视图等控件。 -
values
:该文件夹用于存储各种资源值,例如字符串、颜色、尺寸等。它包含了多个 XML 文件,如strings.xml
(存储应用程序的字符串)、colors.xml
(存储颜色值)和dimens.xml
(存储尺寸值)。 -
xml
:该文件夹用于存储其他 XML 文件,通常用于定义应用程序的配置文件、权限文件、菜单文件等。例如,你可以在该文件夹中创建一个menu.xml
文件来定义应用程序的菜单项。
这些文件夹的使用有助于将不同类型的资源组织到一个项目中,并提供更好的可维护性和可读性。同时,它们也符合 Android 的资源命名约定和目录结构规范。
你也可以将自定义的组件部分
新建一个文件夹并存储在res
目录下
例如:
倘若你需要写一个导航栏(底部),这个组件明显是可以独立出来很多小组件,这样做的目的是
为了使目标更清晰,更换将会变得更加容易,也可以让后来者更加容易理解整个项目的结构
你可以新建一个 memu 目录
如何了解一个项目
通常来说,你仅仅需要观察layout
和MainActivity
及其以下的java类
你首先需要查看AndroidMainfest.xml
程序的主页面将在这里注册以及指明。
<application
android:allowBackup="true" // 允许备份应用数据
android:dataExtractionRules="@xml/data_extraction_rules" // 数据提取规则
android:fullBackupContent="@xml/backup_rules" // 完全备份内容
android:icon="@mipmap/ic_launcher" // 应用图标
android:label="@string/app_name" // 应用名称
android:roundIcon="@mipmap/ic_launcher_round" // 圆形应用图标
android:supportsRtl="true" // 支持右到左布局
android:theme="@style/Theme.NavTwo" // 应用主题样式
tools:targetApi="31"> // 指定目标API版本
<activity
android:name=".MainActivity" // 指定活动的类名
android:exported="true" // 允许其他应用访问此活动
android:label="@string/app_name" // 活动的显示名称
android:theme="@style/Theme.NavTwo.NoActionBar"> // 活动的主题样式(无标题栏)
<intent-filter> // 意图过滤器,指定活动的启动条件
<action android:name="android.intent.action.MAIN" /> // 主要动作,应用程序的入口点
<category android:name="android.intent.category.LAUNCHER" /> // 启动器类别,将应用显示在设备的应用列表中
</intent-filter>
</activity>
</application>
当你使用ctrl+鼠标左键
来点击.MainActivity
(很显然,这是一个路径),你就可以跳转到默认的Activity了
开发建议Tips
- 当你在需要指明路径时,使用
@+文件夹/路径
来指明存放位置 - 当你新建一个应用界面的时候需要
newActivity
而不是一个LayoutResourceFile
,前者可以会自动注册页面,新建对应的java类连接到这个layout
。 - 但如果你可能不小心仅仅创建了一个后者,你需要在在
layout
中的<androidx.coordinatorlayout.widget.CoordinatorLayout
添加上这句话tools:context="com.example.testobject.drawerlayout"
并且在java类中的重写父元素的onCreate
中加入
setContentView(你的layout);
- 你需要注意是
layout
和java类
名称是对应的activity_main
对应到MainActivity
常见的extends类
在安卓开发中,常见的一些扩展类(extend类)包括:
1. AppCompatActivity:用于创建支持新的Material Design风格的Activity,是Activity的一个子类。
2. Fragment:用于创建模块化的UI组件,可以嵌入到Activity中。
3. Service:用于创建后台运行的服务组件,执行长时间运行的任务。
4. BroadcastReceiver:用于接收和处理系统广播消息。
5. ViewModel:用于存储和管理与UI相关的数据,提供数据给UI组件观察。
6. RecyclerView.Adapter:用于连接数据集和RecyclerView控件,负责管理列表或网格布局中的数据项。
7. AsyncTask:用于在后台线程执行异步任务,并在主线程更新UI。
8. IntentService:是Service的子类,用于处理异步任务,并在任务完成后自动停止。
组件化ViewModel+Fragment
ViewModel和Fragment是Android Jetpack组件中的两个重要概念。
- ViewModel:
ViewModel是设计用于存储和管理与UI相关的数据的类。它的目的是将UI组件(如Activity或Fragment)与数据分离,使得数据在配置变化(如屏幕旋转)时能够保持一致,并且在不同的UI组件之间共享数据。
ViewModel的主要作用包括:
- 存储与UI相关的数据,如用户输入、网络请求的结果等。
- 处理与UI相关的业务逻辑,如数据转换、格式化等。
- 提供数据给UI组件观察,以便在数据变化时更新UI。
ViewModel的生命周期与UI组件(如Activity或Fragment)相关联,它会在UI组件的生命周期中保持一致,并且在配置变化时不会被销毁和重建。
- Fragment:
Fragment是Android中的一种UI组件,它可以看作是一个模块化的UI单元,可以嵌入到Activity中,用于构建灵活和可重用的用户界面。
Fragment的主要作用包括:
- 显示用户界面,可以包含布局、视图和交互逻辑。
- 处理与用户交互的事件,如点击、滑动等。
- 管理自身的生命周期,与Activity的生命周期相关联。
Fragment可以看作是Activity的一部分,它可以在Activity中被添加、替换或移除,可以与其他Fragment进行通信和交互。
ViewModel和Fragment在Android应用程序中通常一起使用(你可以在一个组件列表菜单注册
和登录
,新建Login
和Register
文件夹,
下面分别放置LoginViewModel
和LoginFragement
等等),
ViewModel负责管理数据,Fragment负责显示数据和处理用户交互。这种分离使得UI组件更加模块化和可测试,同时也提供了更好的数据持久性和生命周期管理。
新建GalleryFragment和ViewModel
layout
不再讲解,Gallery是导航栏菜单的一个选项
public class GalleryFragment extends Fragment {
private FragmentGalleryBinding binding;
// 在Fragment创建视图时调用,用于创建和返回Fragment的视图
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
// 创建一个GalleryViewModel对象,用于管理与该Fragment相关的数据
GalleryViewModel galleryViewModel =
new ViewModelProvider(this).get(GalleryViewModel.class);
// 使用Data Binding将布局文件FragmentGalleryBinding与该Fragment关联
binding = FragmentGalleryBinding.inflate(inflater, container, false);
View root = binding.getRoot();
final TextView textView = binding.textGallery;
// 观察GalleryViewModel中的数据变化,并将数据设置到TextView上
galleryViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);
return root; // 返回该Fragment的根视图(根页面Activity)
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null; // 在Fragment视图销毁时释放绑定的Data Binding对象
}
}
-
FragmentGalleryBinding
:这是由 Data Binding 自动生成的绑定类,用于在代码中访问与该Fragment关联的布局文件中的视图和数据。可以省区每次查找一个组件都需要
findViewByid
的步骤,来每次调用都可以使用binding.button
-
onCreateView()
:在Fragment的生命周期中,当创建该Fragment的视图时调用。在该方法中,通过inflater
将布局文件FragmentGalleryBinding
与container
(父级视图容器)关联,并返回根视图root
。 -
GalleryViewModel
:这是一个ViewModel类,用于管理与该Fragment相关的数据。通过ViewModelProvider
获取或创建一个GalleryViewModel
对象。 -
getViewLifecycleOwner()
:用于获取与该Fragment关联的视图的生命周期所有者。 -
observe()
:用于观察GalleryViewModel
中的数据变化,并在数据变化时更新UI。在这里,我们观察galleryViewModel.getText()
(返回一个LiveData
对象)的变化,并将数据设置到textView
上。 -
onDestroyView()
:在Fragment的生命周期中,当销毁该Fragment的视图时调用。在该方法中,释放绑定的Data Binding对象,避免内存泄漏。
注意
binding = FragmentGalleryBinding.inflate(inflater, container, false);
这句话中,本页传来的参数LayoutInflater inflater, container, Bundle savedInstanceState
而被赋值以后的值,包含了整个布局文件中定义的元素(如 TextView、Button 等),以及它们的属性和布局关系。这个视图对象代表了整个布局文件的内容
inflater
是是一个 LayoutInflater 对象(视图对象),用于实例化布局资源文件。你可以通过调用 getLayoutInflater() 方法获取当前 Activity 或 Fragment 的 LayoutInflater 实例。 生成的视图对象指的是将布局文件中的 XML 代码转换为实际的视图对象,这些视图对象将在应用程序中显示出来,构成用户界面的一部分(一小块画布)。