Hello Android - Hello World应用程序
学习开发您的第一个Android应用程序。
目录
引言
本文将指导您创建第一个 Android 应用程序。此应用程序名为“Hello World”,它是一个简单的程序,程序员在学习新的编程语言或平台时会编写它。
背景
“Hello World”应用程序只会显示屏幕上的“Hello World”文本,但这是确保您的开发环境正常工作的重要一步。
工具
在本文中,我将使用 Android Studio 来创建“HelloWorld”应用程序,因此您可以从其官方下载页面下载 Android Studio。
注意: Android Studio 需要 Java SE Development Kit (JDK) 6 或更高版本。我建议您使用Oracle JDK,但如果您想使用OpenJDK,则必须安装 OpenJDK 7 或更高版本。
创建项目
首先,打开 Android Studio,然后单击“文件”菜单并选择“新建项目...”
如果这是您第一次运行该程序,您将看到一个项目列表窗口,然后单击右侧的“新建项目...”按钮。
这是单击“新建项目...”按钮后看到的第一个屏幕,用于设置项目属性。
- 应用程序名称: 您的应用程序的名称。在此示例中为 HelloWorld。
- 公司域名: 如果您有公司域名,请输入您的公司域名。例如 vable.me、google.com 等。但如果您没有,也不要担心,您可以输入任何内容,例如 example.com。
- 包名称: Java 包的名称,用于将 Java 类组织到命名空间中。Java 包将通过使用您反转的域名后跟应用程序名称来命名。例如,我使用“android.vable.me”作为域名,Java 包将是“me.vable.android.helloworld”。此步骤 Android Studio 将自动生成。
- 项目位置: 您要在磁盘上存储项目的目录。
然后单击“下一步”按钮。
此页面用于设置您想要支持的 Android 的最低版本。我选择了“API 9:Android 2.3 (Gingerbread)”,因为 99.1% 的 Android 设备运行 Android 2.3 及更高版本。我建议您考虑您想要使用的 Android 功能、目标用户或可以使用您的应用程序的 Android 用户百分比。下图显示了每个 Android 版本的百分比。
选择最低 SDK 后,单击“下一步”按钮。
此页面是您可以与应用程序一起使用的预定义模板列表。选择“无 Activity”,因为我们想学习 Android 应用程序开发的所有基础知识。然后单击“完成”按钮。
之后,您将看到您的工作区。在“项目”面板中展开“HelloWord”项目(如果未显示,请单击左侧边栏中的“1:项目”)。
您将看到项目结构,我将在下面描述。
- .idea 文件夹: 此文件夹包含 Android Studio 使用的文件。不要触摸它。
- app 文件夹: 此文件夹包含许多文件和文件夹,您的所有代码和资源都在这里。
- build 文件夹: 它包含从您的代码构建的文件。
- libs 文件夹:如果您想使用外部 .jar 库,请将其放在此处。
- src 文件夹
- androidTest 文件夹:您应用程序的单元测试代码。
- main 文件夹: 这是主工作路径
- java 文件夹:它包含您的应用程序代码。
- res 文件夹:它包含您的应用程序资源。
- AndroidManifest.xml:在此配置您的 Android 应用程序。
- .gitignore: 如果您使用 git 进行源代码管理,则为 git 忽略配置文件。
- app.iml: 您的项目结构的定义。
- build.gradle:在此配置您的项目和依赖项。
- proguard-rules.pro: 需要保护您的代码吗?在此配置。
- gradle 文件夹: gradle 构建系统文件夹。
- .gitignore: 如果您使用 git 进行源代码管理,则为 git 忽略配置文件。
- build.gradle:在此配置您的工作区。
- gradle.properties: Gradle 配置文件。
- gradlew: 用于构建项目的可执行文件(基于 UNIX)。
- gradlew.bat: 用于构建项目的可执行文件(Windows)。
- HelloWorld.iml: 您的项目结构的定义。
- local.properties: 配置您的工作区属性。
- settings.gradle: 配置 gradle 您要构建哪个项目。
我加粗了需要编辑或需要知道如何工作的文件或文件夹。
动手编码
创建 MainActivity
首先,我们将创建一个继承自“android.app.Activity
”的 Java 类。
Activity
类在 Android 应用程序中代表 Android 应用程序的单个屏幕,如果您想在屏幕上显示某些内容,则需要创建一个Activity
。
展开“java”文件夹,您将看到您的应用程序包文件夹
右键单击您的包文件夹,选择“新建”菜单。您会看到很多选项,是的,它有一个 Activity 选项,但现在您应该自己创建它,而无需使用模板。只需单击“Java 类”。
这是“新建类”屏幕,将名称输入为“MainActivity
”,将种类输入为“类”,然后单击“确定”按钮。
注意:请使用Pascal Case(如Java 类命名约定)来命名Activity
类,并在末尾加上“Activity
”。
您将获得类似这样的代码。
package me.vable.android.helloworld;
public class MainActivity {
}
添加导入声明以导入Activity
基类。
注意: Java 使用导入声明来使调用其他包中的类成为可能,而无需使用它们的完整名称。例如,如果您导入了“Activity
”,则可以使用“Activity
”而不是“android.app.Activity
”。
import android.app.Activity;
然后,放置“extends
”关键字,使MainActivity
继承自Activity
类。
public class MainActivity extends Activity {
}
接下来,重写onCreate
方法以用于构建 UI。
onCreate
方法是 Android 应用程序生命周期的一部分,用于创建要在屏幕上显示的 UI。
提示:您可以键入onCreate
然后按 Ctrl + Space Bar(在 Windows 操作系统上),建议就会显示出来。
提示: 您可以按 Alt + Insert(在 Windows 操作系统上)或在您想看到可生成内容列表的代码块中右键单击。
您将获得类似这样的代码。
package me.vable.android.helloworld;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
注意:重写具体方法时,不要忘记通过调用super.<method name>(<methid parameter>);
来调用超类中的相同方法。
什么是Bundle
?android.os.Bundle
是一个用于在Activity
之间或跨应用程序状态存储和传递数据的类。
现在,您的Activity 类
已完成,但您无法使用它,直到您告知 Android 您的应用程序有一个MainActivity
类。
将 Activity 添加到 AndroidManifest
AndroidManifest.xml 是存储您应用程序基本信息的文件,它用于告知 Android 您的应用程序包名称、应用程序的组件、此应用程序请求的权限等。
引用每个应用程序都必须在其根目录下有一个 AndroidManifest.xml 文件(名称完全相同)。清单文件向 Android 系统呈现有关您应用程序的基本信息,这些信息是系统在运行您应用程序的任何代码之前必须具备的。除其他事项外,清单执行以下操作:
- 它命名了应用程序的 Java 包。包名称用作应用程序的唯一标识符。
- 它描述了应用程序的组件——应用程序组成的活动、服务、广播接收器和内容提供程序。它命名了实现每个组件的类并发布它们的功能(例如,它们可以处理哪些
Intent
消息)。这些声明使 Android 系统知道这些组件是什么以及在什么条件下可以启动它们。- 它确定了哪些进程将托管应用程序组件。
- 它声明了应用程序必须拥有哪些权限才能访问受保护的 API 部分并与其他应用程序进行交互。
- 它还声明了其他人必须拥有哪些权限才能与应用程序的组件进行交互。
- 它列出了应用程序运行时提供性能分析和其他信息的
Instrumentation
类。这些声明仅在应用程序开发和测试期间存在于清单中;在应用程序发布之前会被删除。- 它声明了应用程序所需的最低 Android API 级别。
- 它列出了应用程序必须链接的库。
现在,您的 AndroidManifest.xml 看起来像这样
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.vable.android.helloworld">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
</application>
</manifest>
让我们看看这个清单文件中每个标签的含义。
- manifest 元素:清单的根元素,它声明了这个 xml 文件中使用的命名空间。它必须包含一个
<application>
元素,以及 xmlns:android 和 package 属性。- xmlns 属性:用于声明您将使用的命名空间。
- package 属性:您的应用程序包名称,Android 将使用它来识别您的应用程序。
- application 元素:它描述您的应用程序,例如应用程序名称、图标和主题。此元素将包含您的应用程序组件,如 Activity、Service 和 Provider。
- activity 元素:它代表您的 Activity 类及其配置。
将MainActivity
添加到清单中,方法是将<activity>
元素放入<application>
元素中,并将名称输入为“.MainActivity
”。
注意:您必须将<activity>
元素添加为<application>
的子元素。
注意: android:name
属性引用类路径,您可以使用相对于主包的相对路径或绝对路径。例如,如果您的类路径是me.vable.android.helloworld.MainActivity
,而清单的包是me.vable.android.helloworld
,则您可以使用“.MainActivity”或其绝对路径。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.vable.android.helloworld">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" >
</activity>
</application>
</manifest>
好的,现在您已经告知 Android 您拥有 MainActivity 类,但 Android 仍然不知道如何运行您的应用程序。您需要告诉它应用程序启动后将启动的第一个 Activity 是什么。
<intent-filter>
用于描述您的 Activity、Service 或 Receiver 将与之交互的事件。当 Android 调用应用程序来启动 Activity 或发出事件时,它将通过查看 intent-filter 列表来查找该事件的负责者。
<activity android:name=".MainActivity" >
<intent-filter>
</intent-filter>
</activity>
接下来,您需要指定您的Activity
将与之交互的事件。intent-filter 可以包含 action、category 和 data。
- <action>: 它引用标准操作,指示组件的交互,例如 main、web search、pick 等。
- <category>:它引用此组件的类型,例如 launcher、browser 等。
- <data>: 引用要操作的数据的 URI。例如,要查看的网站 URI。
当 Android 调用应用程序启动时,它将发送带有操作android.intent.action.MAIN
和类别android.intent.category.LAUNCHER
的 intent。将其写入您的清单!!
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.vable.android.helloworld">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
注意:并非所有 Activity 都需要添加 intent-filter。
构建(编译)应用程序项目
每次在对项目进行编码或编辑后,您都需要将项目构建为 Android 应用程序包 (APK),然后才能将其部署到设备或虚拟设备。
要构建项目,请单击工具栏上的“构建”菜单,然后选择“构建项目”(或者您可以在 Windows 操作系统上使用快捷方式 Ctrl + F9)。
构建完成后,Android Studio 会在状态栏(屏幕底部)显示构建结果,您可以在“0:消息”标签(状态栏上方)中查看构建消息。
当 BUILD SUCCESSFUL 时,APK 文件将在路径 <project path>/app/build/outputs/apk 中可用,您可以将其部署到设备或模拟器。
如果构建失败,它会告诉您错误原因,您需要修复它然后再次构建。
上图显示了缺少分号 (;) 的错误消息,请尝试修复它然后再次构建。
哇!!您的应用程序几乎完成了,但我们需要在模拟器或真实设备上对其进行测试。
创建虚拟设备
Android SDK 提供了一个 Android Virtual Device (Emulator) 用于在不使用真实设备的情况下测试应用程序,因此您需要通过单击工具栏上的“AVD Manager”图标来创建 Android Virtual Device。
然后将出现 Android Virtual Device Manager 窗口。
单击“创建...”以创建 Android 虚拟设备。
在“创建新的 AVD”窗口中有许多选项可供选择,我将在下面描述。
- AVD 名称: AVD 的名称,您可以设置任何您想要的名称,但它只能包含字符和数字。
- 设备:选择您想要模拟的设备。如果您想要的设备不存在,您可以创建自己的自定义设备定义。
- 目标:此 AVD 的 Android 版本。选择您的应用程序支持的版本。有时您需要测试您的应用程序在许多 Android 版本中的运行情况,您可以创建任意多的模拟器。
- CPU/ABI: 您可以指定模拟器的 CPU。选项中有 Intel、ARM、MISP 等。您可以根据需要选择。Intel CPU 运行速度更快,但有时您的应用程序不支持 Intel 设备。您需要知道大多数 Android 设备都由 ARM 驱动。
- 键盘:如果您想在模拟器窗口中显示硬件键盘,请勾选此项。
- 皮肤:设置模拟器皮肤(UI)。
- 前置摄像头:您想模拟前置摄像头,还是使用您的 PC 摄像头,或者都不使用?
- 后置摄像头:您想模拟后置摄像头,还是使用您的 PC 摄像头,或者都不使用?
- 内存选项
- RAM: 您可以指定 AVD 的 RAM,但如果设置得太大,模拟器可能会在启动时失败。
- VM 堆: 设置 AVD VM 堆大小。
- 内部存储:模拟器的内部存储。
- SD 卡:如果您希望模拟读写外部存储,请设置 SD 卡大小或选择文件。
- 仿真选项:
- 快照: 如果您想在关闭模拟器时保留其状态,请勾选此项。
- 使用主机 GPU: 使用 PC GPU 进行仿真。
开始时,您可以将选项设置得与我相同,然后单击“确定”,将出现选项摘要页面。
创建新的虚拟设备定义
需要自定义虚拟设备?创建它!!
从 AVD Manager 屏幕单击“设备定义”选项卡。
然后单击“创建设备...”
这是设备定义属性列表
- 名称: 设备定义名称。
- 屏幕尺寸: 设备屏幕的尺寸(英寸)。
- 分辨率: 屏幕分辨率(像素)。
- Sensor
- 加速计: 如果您想使用加速计,请勾选此项。
- 陀螺仪: 如果您想使用陀螺仪,请勾选此项。
- GPS: 如果您想使用 GPS,请勾选此项。
- 接近传感器: 如果您想使用接近传感器,请勾选此项。
- 相机
- 前置:如果您想使用前置摄像头,请勾选此项。
- 后置: 如果您想使用后置摄像头,请勾选此项。
- 输入
- 键盘:如果您想使用硬件键盘,请勾选此项并选择其类型。
- RAM: AVD 的总 RAM。
- 尺寸: 设备尺寸,设置屏幕尺寸后会自动设置。
- 屏幕比例:屏幕的比例。大多数设备的屏幕都是长方形的,但有些带硬件键盘的设备屏幕是方形的。
- 按钮:如果您想使用硬件按钮(后退、主页、应用堆栈),请勾选此项。
- 设备状态
- 纵向: 如果您想支持纵向显示,请勾选此项。
- 横向:如果您想支持横向显示,请勾选此项。
配置完成后,单击“创建设备”,您将在列表中看到您的设备定义,并且您可以从此定义创建 AVD。
将应用程序部署到虚拟设备
请确保您的项目已构建。
现在,我们将把“HelloWorld”应用程序安装到模拟器上。最简单的方法是单击工具栏上的“运行 'app'”(绿色三角形)(或 Windows 操作系统上的快捷方式 Shift + F10)。
然后将出现“选择设备”窗口。
如果您有正在运行的虚拟设备或真实设备,它们将显示在表中,选择您要部署应用程序的设备。如果表中没有内容,请从下拉列表中选择“启动模拟器和 Android 虚拟设备”。如果您想将此设备用于将来的启动,请选中“为将来的启动使用同一设备”复选框。然后单击“确定”按钮,模拟器将出现(如果使用模拟器),应用程序将被部署。
现在,您将在模拟器上看到一个内容为空的应用程序,并且应用程序名称显示在顶部的操作栏(ActionBar)中。
准备设备进行开发
如果您有真实 Android 设备,您可以直接将应用程序部署到您的设备,但您需要进行一些设置。
启用开发者选项
在真实设备上,转到“设置”,然后向下滚动到底部。您将看到“关于手机”菜单,点击它。
您将看到“关于手机”屏幕,向下滚动到底部,然后点击“版本号”7 次。
之后 Android 会提示“您是开发者”,返回设置,您将看到“开发者选项”菜单。
点击它,您将看到“开发者选项”屏幕,然后打开它并勾选“USB 调试”,如下图所示。
现在,您的设备允许您部署应用程序进行调试。
安装 ADB USB 驱动程序(Windows 需要,*nix 请忽略)
当您将 Android 设备与 Windows PC 连接时,Windows 将无法识别您的设备。您需要在安装驱动程序之前进行安装,以下是安装驱动程序的说明。
从 Android Studio 工具箱中的“SDK 管理器”菜单打开 Android SDK 管理器。
然后将显示 SDK 管理器窗口。向下滚动,您将看到带有“未安装”状态的“Google USB 驱动程序”复选框(如果您的设备制造商 USB 驱动程序复选框存在,例如 Nokia、Samsung,请勾选它)。
然后单击“安装 <数字> 个软件包...”按钮。
阅读每个软件包的许可证并接受它,然后单击“安装”按钮。
现在,USB 驱动程序已下载。您需要将设备连接到 PC 以安装驱动程序。在 PC 上,打开设备管理器(对于 Windows 8.1,您可以通过右键单击开始按钮来打开设备管理器。对于 Windows 7,您可以通过右键单击计算机并选择“属性”来打开设备管理器,您将在侧边菜单上看到设备管理器链接)。
在设备管理器窗口中,找到“其他设备”,您将看到带有警告符号的某个设备。在图片中,未知设备标记为“Android Phone”(有时会显示为设备名称),右键单击它并选择“更新驱动程序软件”。
然后单击“浏览我的计算机以查找驱动程序软件”选项。
浏览到 <Android SDK PATH>\extras\google\usb_driver,然后单击“下一步”按钮。
驱动程序安装完成后,将显示如下图片。
如果安装后仍出现警告符号或安装失败,请参阅制造商网站或手册上的说明。
将应用程序部署到设备
将应用程序部署到 Android 设备的方法与部署到模拟器的方法相同,但当出现“选择设备”窗口时,选择您的设备而不是模拟器。
单击工具栏上的“运行 'app'”(绿色三角形)(或 Windows 操作系统上的快捷方式 Shift + F10)。
然后将出现“选择设备”窗口。
如果您已连接到 Android 设备,它将显示在表中;如果没有显示,请通过 USB 数据线将设备连接到 PC,然后您就会看到它。选择您要部署应用程序的设备。如果您想将此设备用于将来的启动,请选中“为将来的启动使用同一设备”。然后单击“确定”按钮,应用程序将被部署并执行。
现在,您的设备显示一个内容为空的应用程序,并且应用程序名称显示在顶部的操作栏(ActionBar)中。
添加视图
现在,您可以在模拟器和真实设备上运行应用程序,但屏幕上什么也没有显示,因为您还没有创建它。在本节中,我们将学习使用简单的View
以及其他资源。
应用资源
在 Android 应用程序开发中,您应该将资源(如图片、文本、UI 布局等)排除在代码之外。Android 提供了res
目录来存储资源文件。
让我们看看res
目录。在“项目”面板中,展开路径 <application name>/app/src/main/res,您将看到许多子目录。
- res
- anim:用于存储动画配置文件的目录。
- drawable:用于存储图形和图形配置文件(如图像)的目录。
- layout:用于存储 UI 布局文件(如屏幕布局、列表项布局)的目录。
- values:用于存储值内容文件(如文本、尺寸、样式、颜色)的目录。
注意:如果您缺少某些 res 目录,您可以自己创建它们。
注意:您将看到一些带有限定符的目录,例如drawable-xhdpi
、values-v14
,这是将不同资源应用于具有该属性的特定设备的机制。有关限定符的更多信息,请参阅官方 Android 开发者 API 指南。
注意: res 目录中的大多数文件类型都是 XML,Google 设计了用于特定工作的 XML Schema,例如动画、UI 布局、本地化等。因此,您需要了解一些基本的 XML 知识。
R.java
您的所有资源,如布局、动画、字符串等,都可以通过 Java 代码访问。当您添加资源时,Android 会重新生成 R.java 文件,该文件定义了您的资源 ID,允许您通过 Java 代码使用这些资源。
图片显示您在drawable<xxxx>
文件夹中有一个 ic_launcher.png 文件,并且在 R.java 中,您将在drawable
类中有一个名为ic_launcher
的静态 int 变量。
示例:通过 Java 代码访问资源
getResources().getDrawable(R.drawable.ic_launcher);
您可以通过getResources()
方法访问所有资源,然后跟着每种资源类型的访问器方法,并以资源 ID 作为参数。
布局
布局资源文件用于创建用户界面,如屏幕、列表项、对话框等。它本质上是一个 XML 文件,但功能强大。
Android 不使用像素坐标来定位 UI,因为 Android 支持的屏幕尺寸、分辨率和纵横比非常多。Android 提供了一个Layout
来对View
元素进行分组和对齐。简单的Layout
将在下面描述。
- LinearLayout:这是一个非常简单的布局。此布局中的每个元素将以水平或垂直堆叠对齐。
- FrameLayout:这是一个框架,您可以在其中将元素放置在顶部、中心、底部或角落。
- RelativeLayout:当您想根据其他元素的位置来定位元素时,
RelativeLayout
就是答案。 - GridLayout:如果您想将元素按网格对齐,请使用
GridlLayout
,它类似于一个表格,您可以将元素放置到单元格中,您可以跨行和跨列。 - AbsoluteLayout:允许您将 UI 元素放置到 X、Y 坐标位置的布局。不建议再使用,已弃用。
尺寸
当 Android 不推荐使用坐标定位 UI 时,它也不推荐固定 UI 元素的大小。Android 提供了特定的单位和值来确定View
的大小。
- MATCH_PARENT:将元素的大小(宽度或高度)设置为适合其父级。
- FILL_PARENT:与
MATCH_PARENT
相同,但支持 Android 2.2 及更低版本。 - WRAP_CONTENT:将元素的大小(宽度或高度)设置为适合其父级。
- dp(dip) 单位:这是一个从屏幕物理密度计算得出的抽象单位。可用于定义元素的大小或其外边距和内边距。
- sp 单位:类似于
dp
单位,但它还根据用户偏好的字体大小进行计算,建议用于调整文本大小。
让我们创建布局(屏幕)
要创建布局,您需要在 res/layout 目录中创建布局文件(如果不存在,请创建它)。
右键单击 layout 目录,选择“新建 > 布局资源文件”。
将文件名输入为activity_main
,以指示这是MainActivity
的布局文件。
注意:布局文件的命名约定是以类类型开头,例如 activity、fragment、listitem 等,然后跟上名称,例如 main、detail 等,并且仅使用小写字母、数字和下划线。例如,您有一个名为“MainActivity”的 Activity,此 Activity 的布局应命名为“activity_main.xml”。
您将看到窗口内容如下。
这是布局设计器,它允许您将 UI 元素拖放到屏幕上并设置它们的属性。布局文件由 XML 文件驱动,当您在设计视图中拖放或更改某些内容时,XML 代码会自动更改。另一方面,如果您在XML 视图中编写某些内容,它会影响设计视图。
尝试单击布局设计器底部标签“Text”来打开XML 视图。
您将看到类似这样的 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">
</LinearLayout>
注意: Android 布局资源文件的根元素必须具有 Android 命名空间声明。
回到设计视图,尝试从“调色板”中拖动Large TextView
并将其拖放到设备屏幕上。
现在,屏幕上有一个TextView
。如果您想添加其他元素,您可以这样做,但在本文中我将专注于 TextView。
将 MainActivity 设置为使用 activity_main.xml 作为其 UI
转到您的MainActivity
,找到onCreate()
方法,并将setContentView()
语句及其参数设置为您的布局 ID。
package me.vable.android.helloworld;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
现在,您可以运行应用程序来测试结果。
尝试编辑属性
回到 activity_main.xml 的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="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/textView" />
</LinearLayout>
LinearLayout 的子元素中出现了一个<TextView>元素。
注意:您可以从 XML 代码设置属性,也可以使用设计视图左下角的 GUI 属性面板。
尝试将 TextView 属性更改为
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Hello Android"
android:id="@+id/textview_hello_android" />
回到设计视图,您将在屏幕上看到文本“Hello Android”。
以下是一些视图属性解释
- android:id - 用于引用此
View
的 ID。Android 将从此属性生成 ID 资源。 - android:layout_width -
View
的宽度,您可以从尺寸主题中查看可能的值。 - android:layout_height -
View
的高度,您可以从尺寸主题中查看可能的值。 - android:text - 您想显示的文本,可以设置为硬编码字符串或字符串资源。
- android:textAppearance - 文本的外观。
- android:layout_margin - 此
View
与其他View
之间的间距。可能的值是硬编码的尺寸类型,例如 8dp 或尺寸资源。 - android:padding -
View
周围的间距或区域(内部),不允许放置内容。可能的值是硬编码的尺寸类型,例如 8dp 或尺寸资源。 - android:gravity - 定义内容在此
View
中的位置的属性,例如左、右、居中等。 - android:layout_gravity - 定义此
View
在其Parent View
中的位置的属性,例如左、右、居中等。
图片显示了外边距、内边距和内容区域。外边距由橙色表示,它是充当View
之间间隙的View
外部区域。黄色是内边距,不允许放置任何内容的区域。中间是内容显示区域,如果内容区域大于其内容,您会看到内容始终放置在左上角,除非您设置了android:gravity 属性。
现在,“Hello Android”应用程序已完成。但我们将学习更多关于一些简单的资源。
字符串资源
提供静态文本字符串、复数字符串和字符串数组的资源类型。Android 建议您使用字符串资源而不是硬编码字符串。
字符串资源的优势
- 将字符串放在一处- 更易于管理,您可以编辑字符串而不必花费时间查找其位置。
- 面向设备- 您可以通过使用
资源限定符
为不同屏幕尺寸显示不同的字符串。 - 国际化和本地化- 当 Android 允许您通过
qualifiers-suffix
为不同设备提供不同资源时,它也允许您创建多语言应用程序。您可以在values-<language code>
文件夹中为特定语言创建字符串资源,例如,如果您在values-th
文件夹中有字符串资源,当您的应用程序在显示语言为泰语的设备上运行时,Android 将使用values-th
中的字符串而不是values
。 - 可重用- 是的,您可以根据需要重用字符串。如果您有许多显示相同字符串的元素,您可以使用一个字符串资源。
尝试使用
字符串资源位于 res/value(-xxx)
默认情况下,当您创建项目时,string.xml
会自动创建。打开 string.xml,您将看到类似这样的 XML 代码。
<resources>
<string name="app_name">HelloWorld</string>
</resources>
只有一个名为“app_name”的字符串资源,用于在 Manifest 文件中设置您的应用程序名称。我建议您创建一个新的字符串资源文件,方法是右键单击 values 文件夹并选择“新建 > 值资源文件”选项。
将其命名为activity_main_strings.xml
,以指示此字符串文件用于在MainActivity
上显示,然后打开它。
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
为 Hello Android TextView 创建字符串。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="textview_hello_android">Hello Android!!</string>
</resources>
现在,打开您的 MainActivity 布局文件,尝试使用字符串资源而不是硬编码字符串。
注意:在 XML 代码中,您可以通过使用 @string/<您的字符串资源名称> 来引用您的字符串资源。
<?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="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="@string/textview_hello_android" android:id="@+id/textview_hello_android" /> </LinearLayout>
您将在预览屏幕或设计视图中看到结果。为确保您的项目正常运行,请在您的设备或模拟器上运行该应用程序。
国际化与本地化
您可以通过翻译您的字符串资源并将其放入名为“values-<language code>
”的目录中来本地化您的应用程序。有关支持的语言列表,您可以从这个Stack Overflow 线程找到。
我将创建一个泰语字符串资源作为示例。
首先,在 res/ 中创建一个目录,命名为values-th
。
其次,创建字符串资源文件或从 values 目录复制它。
现在,打开它并输入翻译文本。
注意:必须使用与values
目录中的字符串资源相同的名称。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="textview_hello_android">
สวัสดี แอนดรอยด์!!
</string>
</resources>
最后,在将泰语设置为显示语言的设备或模拟器上进行测试。
要设置显示语言,请转到“设置”>“语言和输入法”>“语言”,然后选择您想要的语言。
这是结果。文本“Hello Android!!”已被翻译成“สวัสดี แอนดรอยด์!!”。
注意:没有翻译的字符串将显示为原始字符串(来自values
目录)。
注意:当您为分发签名应用程序时,如果某些字符串没有翻译,将会抛出错误。您需要将所有字符串翻译成您想要支持的语言。
要翻译应用程序名称,只需将 values/strings.xml 复制到 values-th/strings.xml 并进行翻译。
<resources>
<string name="app_name">สวัสดีชาวโลก</string>
</resources>
图标下方的应用程序名称也会更改。(如果未更改,您可以卸载应用程序然后重新安装)
颜色值资源
在 XML 中,您可以使用硬编码的颜色值
来为View
组件着色。与字符串值一样,您也可以将其创建为资源。
现在,让我们在 values 目录中创建 color.xml。
打开它,您会发现代码看起来与其他值资源类似。
注意:所有值资源都可以放在同一个文件中,因为它们的结构相同,但我建议您为将来的管理创建单独的文件。
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
通过添加带有 name 属性的 color 标签来添加颜色资源,其值为颜色代码。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="orange">#FF7411</color>
</resources>
我创建了一个名为 orange 的颜色,颜色代码为 #FF7411。
让我们尝试在 activity_main.xml 中使用它来设置文本颜色。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/textview_hello_android"
android:id="@+id/textview_hello_android"
android:textColor="@color/orange"/>
现在,您的TextView
的文本是橙色的。
注意: android:textColor 用于设置文本颜色。
尺寸资源
要调整View
的大小和位置,您可以使用 dp、sp、px 单位的静态值,我们也将使其成为资源。
当您将尺寸值作为资源时,您可以在一个地方编辑该值,它会影响所有使用此资源的View
。
现在,让我们在 values 目录中创建 dimens.xml。
然后将一些 dimens 资源放入其中。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="margin_default">16dp</dimen>
</resources>
我创建了一个 dimens 值,用作View
的默认外边距。
尝试在 activity_main.xml 中使用它来设置TextView
的外边距。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/textview_hello_android"
android:id="@+id/textview_hello_android"
android:textColor="@color/orange"
android:layout_margin="@dimen/margin_default"
/>
现在,外边距已应用。
注意: android:layout_margin 用于设置当前View
与其他View
之间的间距。
您也可以尝试将其用于其他属性,如内边距、宽度、高度等。
为分发签名应用程序
在 APK 打包过程中,您的应用程序内容将使用私钥进行签名。如果应用程序未签名,您将无法安装它。
对于调试或测试应用程序,Android Build Tools 会检查调试密钥库。如果不存在,Android SDK 将生成一个新的并使用它来签名调试 APK。
KeyStore 是安全证书的存储库,Android 使用它来存储证书(密钥)。密钥库文件是唯一的,这意味着如果密钥库丢失,则不可能创建相同的密钥库,并且您将无法更新您的应用程序。
当您从一台 PC 将调试 APK 部署到设备,然后从另一台 PC 重新部署应用程序时,Android 会提示您先卸载旧的,然后再重新安装,因为它认为两个调试 APK 来自不同的所有者,并且是不同的应用程序。
当您要分发您的应用程序时,您需要使用自己的私钥而不是调试密钥来签名您的应用程序。
创建您自己的密钥库
使用 Android Studio,您可以在 GUI 工具中创建自己的证书。单击“构建”菜单并选择“生成签名 APK...”选项,然后将出现向导。
单击“创建新...”按钮创建一个新的。
浏览您要存储 KeyStore 的位置并输入名称。
然后输入其他信息。
- 密钥库路径:您在上一步中选择的 KeyStore 文件的路径。
- 密码/确认:KeyStore 的密码(请记住它)。
- 密钥:这是证书,包含私钥和公钥。
- 别名:证书的别名(请记住它)。
- 密码/确认:此证书的密码(请记住它)。
- 有效期(年):此证书的有效期。
- 证书
- 名字和姓氏:您的全名。
- 组织单位:您的组织单位。
- 组织:您的组织名称。
- 城市或地区: 您的组织所在的城市。
- 州或省: 您的组织所在的省份。
- 国家代码:您的组织所在国家/地区代码。
然后单击“确定”按钮。将创建密钥库,否则将抛出错误。
您将看到向导会自动填充您的密钥库和别名,并且有一个记住密码的选项,但是您需要自己记住密钥库信息。
然后,单击“下一步”按钮。
您可以选择一个签名 APK 的目标文件夹(如果不存在,请自己创建),以及构建类型(默认有 release 和 debug 选项。如果您想分发,请选择“release”)。然后单击“完成”按钮。
APK 签名结果将显示在状态栏中,其构建消息将显示在“0:消息”标签中。
如果它显示任何错误或缺失的信息,您需要修复它然后再次签名。
签名后,您可以将应用程序分发给他人,并上传到商店。
注意:KeyStore 文件可以包含一个或多个别名,但我建议为一个 KeyStore 只创建一个别名。
注意: 别名是实际的证书。您只需要使用一个别名来签名应用程序,如果您使用不同的别名签名应用程序,您将无法更新您的应用程序。
无法运行应用?阅读本文
Richard MacCutchan 问我他无法运行应用程序并收到错误消息。
08-11 14:27:15.990 863-863/me.vable.android.helloworld D/dalvikvm﹕ Not late-enabling CheckJNI (already on) 08-11 14:27:16.600 863-863/me.vable.android.helloworld D/AndroidRuntime﹕ Shutting down VM 08-11 14:27:16.600 863-863/me.vable.android.helloworld W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb2ac8d70) 08-11 14:27:16.610 863-863/me.vable.android.helloworld E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: me.vable.android.helloworld, PID: 863 java.lang.RuntimeException: Unable to start activity ComponentInfo{me.vable.android.helloworld/me.vable.android.helloworld.MainActivity}: android.util.AndroidRuntimeException: You cannot combine swipe dismissal and the action bar. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2197)
这个错误消息很有趣,因为它不是程序员的错误,而是 Android 兼容性问题。当您尝试使用针对 Android 4.4W 或 Android L 的目标版本构建应用程序时,您将无法在旧版本 Android 设备上安装或运行它。
让我们看一下app.gradle
文件。
apply plugin: 'com.android.application' android { compileSdkVersion 20 buildToolsVersion "20.0.0" defaultConfig { applicationId "me.vable.android.helloworld" minSdkVersion 9 targetSdkVersion 20 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
- apply plugin: 'com.android.application' - 此语句用于导入 Android Build 插件。
- android - Android 配置
- compileSdkVersion - 您用于构建应用程序的 Android SDK 版本。应与 targetSdkVersion 相同。
- buildToolsVersion - 构建工具版本。
- defaultConfig - 应用程序构建的默认配置。
- applicationId "me.vable.android.helloworld" - 您的应用程序的包名称。
- minSdkVersion - 您想要支持的最低 Android 版本。
- targetSdkVersion - 此应用程序的目标 Android 版本。输入您设备的版本或尽可能高的版本。
- versionCode - 代码的版本。
- versionName - 代码的版本名称。
- buildTypes - 构建类型的声明
- release - 构建类型名称
- runProguard - 要使用Proguard 吗?
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - Proguard 规则路径。
- release - 构建类型名称
- dependencies - 在此处配置库。
- compile fileTree(dir: 'libs', include: ['*.jar']) - 导入 libs 文件夹中的所有 .jar 库。
Richard MacCutchan 找到的错误原因是compileSdkVersion和targetSdkVersion被设置为版本20。我让他将compileSdkVersion和targetSdkVersion设置为19或更低版本并再次测试。他告诉我这样可以正常工作。
结论是,您应该将 targetSdk 和 compileSdk 设置为 19 或更低版本来修复此问题,直到 Google 修复 Android 4.4W 和 Android L 的兼容性问题。
注意:当您想上传应用程序的更新到商店时,您需要增加versionCode 和versionName 。例如,旧的 versionCode 是 1,versionName 是“1.0.0.0”,您需要将 versionCode 设置为 2 或更高,并将 versionName 设置为与旧版本不同的内容,例如“1.0.0.1”或“2.0.0.0”。
apply plugin: 'com.android.application' android { compileSdkVersion 19 buildToolsVersion "20.0.0" defaultConfig { applicationId "me.vable.android.helloworld" minSdkVersion 9 targetSdkVersion 19 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
**Lollipop Android 发布后,不再存在兼容性问题,但您需要将 android support library 更新到 v21+。
如果您遇到其他问题,可以通过回复此主题向我提问。
看点
恭喜您,您已经创建了第一个 Android 应用程序。您已经了解了 Android 应用程序开发的基础知识,这是理解未来学习内容的最重要一步。希望您享受您的 Android 应用程序开发生涯,
历史
- 2014年8月1日 首次发布。
- 2014年8月1日 添加完整的项目下载链接。
- 2014年8月1日 修复样式以符合 CodeProject 标准并尝试纠正句子。
- 2014年8月1日 修复布局并尝试纠正句子。
- 2014年8月1日 修复文章索引链接。
- 2014年8月1日 删除所有自定义 CSS,因为 CodeProject 文章有写作规则。
- 2014年8月2日 纠正一些句子错误。
- 2014年8月5日 纠正拼写错误。
- 2014年8月6日 纠正拼写错误。
- 2014年8月13日 添加问题和解释。
- 2014年8月13日 将下载链接移至顶部。
- 2014年8月16日 纠正拼写错误。
- 2014年8月19日 添加更多图片。