1.1.1创建Android项目
编写:yuanfentiank789 - 原文:http://developer.android.com/training/basics/firstapp/creating-project.html
一个Android项目包含了所有构成Android应用的源代码文件。
本小节介绍如何使用Android Studio或者是SDK Tools中的命令行来创建一个新的项目。
Note:在此之前,我们应该已经安装了Android SDK,如果使用Android Studio开发,应该确保已经安装了Android Studio。否则,请先阅读 Installing the Android SDK按照向导完成安装步骤。
使用Android Studio创建项目
1. 使用Android Studio创建Android项目,启动Android Studio。
- 如果我们还没有用Android Studio打开过项目,会看到欢迎页,点击New Project。
- 如果已经用Android Studio打开过项目,点击菜单中的File,选择New Project来创建一个新的项目。
2. 参照图1在弹出的窗口(Configure your new project)中填入内容,点击Next。按照如图所示的值进行填写会使得后续的操作步骤不不容易差错。
- Application Name此处填写想呈现给用户的应用名称,此处我们使用“My First App”。
- Company domain 包名限定符,Android Studio会将这个限定符应用于每个新建的Android项目。
- Package Name是应用的包命名空间(同Java的包的概念),该包名在同一Android系统上所有已安装的应用中具有唯一性,我们可以独立地编辑该包名。
- Project location操作系统存放项目的目录。
图1Configure your new project
3. 在Select the form factors your app will run on窗口勾选Phone and Tablet。
4. Minimum SDK, 选择 API 8: Android 2.2 (Froyo). Minimum Required SDK表示我们的应用支持的最低Android版本,为了支持尽可能多的设备,我们应该设置为能支持你应用核心功能的最低API版本。如果某些非核心功能仅在较高版本的API支持,你可以只在支持这些功能的版本上开启它们(参考兼容不同的系统版本),此处采用默认值即可。
5. 不要勾选其他选项 (TV, Wear, and Glass) ,点击 Next.
6. 在Add an activity to 窗口选择Basic Activity,点击 Next.
7. 在Choose options for your new file 窗口修改Activity Name 为MyActivity,修改 Layout Name 为activity_my,Title 修改为MyActivity,Menu Resource Name 修改为menu_my。
8. 点击Finish完成创建。
刚创建的Android项目是一个基础的Hello World项目,包含一些默认文件,我们花一点时间看看最重要的部分:
app/src/main/res/layout/activity_my.xml
这是刚才用Android Studio创建项目时新建的Activity对应的xml布局文件,按照创建新项目的流程,Android Studio会同时展示这个文件的文本视图和图形化预览视图,该文件包含一些默认设置和一个显示内容为“Hello world!”的TextView元素。
app/src/main/java/com.mycompany.myfirstapp/MyActivity.java
用Android Studio创建新项目完成后,可在Android Studio看到该文件对应的选项卡,选中该选项卡,可以看到刚创建的Activity类的定义。编译并运行该项目后,Activity启动并加载布局文件activity_my.xml,显示一条文本:"Hello world!"
app/src/main/AndroidManifest.xml
manifest文件描述了项目的基本特征并列出了组成应用的各个组件,接下来的学习会更深入了解这个文件并添加更多组件到该文件中。
app/build.gradle
Android Studio使用Gradle 编译运行Android工程. 工程的每个模块以及整个工程都有一个build.gradle文件。通常你只需要关注模块的build.gradle文件,该文件存放编译依赖设置,包括defaultConfig设置:
- compiledSdkVersion 是我们的应用将要编译的目标Android版本,此处默认为你的SDK已安装的最新Android版本(目前应该是4.1或更高版本,如果你没有安装一个可用Android版本,就要先用SDK Manager来完成安装),我们仍然可以使用较老的版本编译项目,但把该值设为最新版本,可以使用Android的最新特性,同时可以在最新的设备上优化应用来提高用户体验。
- applicationId 创建新项目时指定的包名。
- minSdkVersion 创建项目时指定的最低SDK版本,是新建应用支持的最低SDK版本。
- targetSdkVersion 表示你测试过你的应用支持的最高Android版本(同样用API level表示).当Android发布最新版本后,我们应该在最新版本的Android测试自己的应用同时更新target sdk到Android最新版本,以便充分利用Android新版本的特性。更多知识,请阅读Supporting Different Platform Versions。
更多关于Gradle的知识请阅读Building Your Project with Gradle
注意/res目录下也包含了resources资源:
drawable<density>/
存放各种densities图像的文件夹,mdpi,hdpi等,这里能够找到应用运行时的图标文件ic_launcher.png
layout/
存放用户界面文件,如前边提到的activity_my.xml,描述了MyActivity对应的用户界面。
menu/
存放应用里定义菜单项的文件。
values/
存放其他xml资源文件,如string,color定义。string.xml定义了运行应用时显示的文本"Hello world!"
要运行这个APP,继续下个小节的学习。
使用命令行创建项目
如果没有使用Android Studio开发Android项目,我们可以在命令行使用SDK提供的tools来创建一个Android项目。
1. 打开命令行切换到SDK根目录下;
2. 执行:
代码语言:javascript复制tools/android list targets
会在屏幕上打印出我们所有的Android SDK中下载好的可用Android platforms,找想要创建项目的目标platform,记录该platform对应的Id,推荐使用最新的platform。我们仍可以使自己的应用支持较老版本的platform,但设置为最新版本允许我们为最新的Android设备优化我们的应用。如果没有看到任何可用的platform,我们需要使用Android SDK Manager完成下载安装,参见 Adding Platforms and Packages。
3. 执行:
代码语言:javascript复制android create project --target <target-id> --name MyFirstApp
--path <path-to-workspace>/MyFirstApp --activity MyActivity
--package com.example.myfirstapp
替换<target-id>
为上一步记录好的Id,替换<path-to-workspace>
为我们想要保存项目的路径。
Tip:把
platform-tools/
和tools/
添加到环境变量PATH
,开发更方便。
到此为止,我们的Android项目已经是一个基本的“Hello World”程序,包含了一些默认的文件。要运行它,继续下个小节的学习。
1.1.2执行Android程序
编写:yuanfentiank789 - 原文:http://developer.android.com/training/basics/firstapp/running-app.html
通过上一节课创建了一个Android的Hello World项目,项目默认包含一系列源文件,它让我们可以立即运行应用程序。
如何运行Android应用取决于两件事情:是否有一个Android设备和是否正在使用Android Studio开发程序。本节课将会教使用Android Studio和命令行两种方式在真实的android设备或者android模拟器上安装并且运行应用。
在真实设备上运行
如果有一个真实的Android设备,以下的步骤可以使我们在自己的设备上安装和运行应用程序:
手机设置
- 把设备用USB线连接到计算机上。如果是在windows系统上进行开发的,你可能还需要安装你设备对应的USB驱动,详见OEM USB Drivers 文档。
- 开启设备上的USB调试选项。
- 在大部分运行Andriod3.2或更老版本系统的设备上,这个选项位于“设置>应用程序>开发选项”里。
- 在Andriod 4.0或更新版本中,这个选项在“设置>开发人员选项”里。
Note: 从Android4.2开始,开发人员选项在默认情况下是隐藏的,想让它可见,可以去设置>关于手机(或者关于设备)点击版本号七次。再返回就能找到开发人员选项了。
从Android Studio运行程序
- 选择项目的一个文件,点击工具栏里的Run按钮。
- Choose Device窗口出现时,选择Choose a running device单选框,点击OK。
Android Studio 会把应用程序安装到我们的设备中并启动应用程序。
从命令行安装运行应用程序
打开命令行并切换当前目录到Andriod项目的根目录,在debug模式下使用Gradle编译项目,使用gradle脚本执行assembleDebug编译项目,执行后会在build/目录下生成MyFirstApp-debug.apk。
Windows操作系统下,执行:
代码语言:javascript复制gradlew.bat assembleDebug
Mac OS或Linux系统下:
代码语言:javascript复制$ chmod x gradlew
$ ./gradlew assembleDebug
编译完成后在app/build/outputs/apk/目录生成apk。
Note: chmod命令是给gradlew增加执行权限,只需要执行一次。
确保 Android SDK里的 platform-tools/
路径已经添加到环境变量PATH
中,执行:
adb install bin/MyFirstApp-debug.apk
在我们的Android设备中找到 MyFirstActivity,点击打开。
在模拟器上运行
无论是使用 Android Studio 还是命令行,在模拟器中运行程序首先要创建一个 Android Virtual Device(AVD)。AVD 是对 Android 模拟器的配置,可以让我们模拟不同的设备。
创建一个 AVD:
1. 启动 Android Virtual Device Manager(AVD Manager)的两种方式:
代码语言:javascript复制* 用Android Studio, **Tools > Android > AVD Manager**,或者点击工具栏里面Android Virtual Device Manager![image](avd-manager-studio.png);
* 在命令行窗口中,把当前目录切换到`<sdk>/tools/` 后执行:
代码语言:javascript复制android avd
2. 在AVD Manager 面板中,点击Create Virtual Device.
3. 在Select Hardware窗口,选择一个设备,比如 Nexus 6,点击Next。
4. 选择列出的合适系统镜像.
5. 校验模拟器配置,点击Finish。
更多AVD的知识请阅读Managing AVDs with AVD Manager.
从Android Studio运行程序:
1. 在Android Studio选择要运行的项目,从工具栏选择Run;
2. Choose Device窗口出现时,选择Launch emulator单选框;
3. 从 Android virtual device下拉菜单选择创建好的模拟器,点击OK;
模拟器启动需要几分钟的时间,启动完成后,解锁即可看到程序已经运行到模拟器屏幕上了。
从命令行安装运行应用程序
1. 用命令行编译应用,生成位于app/build/outputs/apk/的apk;
2. 确认platform-tools/ 已添加到PATH环境变量;
3. 执行如下命令:
代码语言:javascript复制adb install app/build/outputs/MyFirstApp-debug.apk
4. 在模拟器上找到MyFirstApp,并运行。
以上就是创建并在设备上运行一个应用的全部过程!想要开始开发,点击next lesson。
1.1.3建立简单的用户界面
编写:yuanfentiank789 - 原文:http://developer.android.com/training/basics/firstapp/building-ui.html
在本小节里,我们将学习如何用 XML 创建一个带有文本输入框和按钮的界面。下一节课将学会使 APP 对按钮做出响应——按钮被按下时,文本框里的内容被发送到另外一个 Activity。
Android 的图形用户界面由多个视图(View)和视图组(ViewGroup)构建而成。View 是通用的 UI 窗体小组件,如:按钮(Button)、文本框(Text field);而 ViewGroup 则是用来定义子视图布局的不可见的容器,如:网格部件(grid)、垂直列表部件(vertical list)。
Android 提供了一系列对应于 View 和 ViewGroup 子类的 XML 标签,以便我们用 XML 创建自己的 UI。
Layouts 是 ViewGroup 的子类。我们将在接下来的教程中练习如何使用 LinearLayout。
图 1 关于 ViewGroup 对象如何组织布局分支和包含其他 View 对象。
可选的布局文件 有很多理由使得我们选择在 XML 中定义界面布局,而不是在运行时动态生成布局。其中最重要的一点是——这可以让你为不同大小的屏幕创建不同的布局文件。例如,你可以创建两个版本的布局文件,告诉系统在小屏幕上使用其中一个布局文件,在大屏幕上使用另外一个布局文件。参见 兼容不同的设备。
创建一个 LinearLayout
- 在 Android Studio 中,从
res/layout
目录打开content_my.xml
文件。 上一节创建新项目时生成的 BlankActivity 包含一个content_my.xml
文件,该文件根元素是一个包含 TextView 的 RelativeLayout。 - 在 Preview 面板点击关闭右侧 Preview 面板。
- 在 Android Studio 中打开布局文件时,可以看到一个 Preview 面板。点击这个面板中的标签,可利用 WYSIWYG(所见即所得)工具在 Design 面板看到对应的图形化效果。但在本节中,我们将学习如何直接修改 XML 文件。
- 删除 [<TextView>] 标签。
- 把 [<RelativeLayout>] 标签改为 [<LinearLayout>]。
- 为 [<LinearLayout>] 添加 android:orientation 属性并设置值为
"horizontal"
。 - 去掉
android:padding
属性和tools:context
属性。
修改后结果如下:
res/layout/content_my.xml
代码语言:javascript复制<LinearLayout 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:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_my">
LinearLayout 是 ViewGroup 的子类,用于放置水平或者垂直方向的子视图部件,放置方向由属性 android:orientation 决定。LinearLayout 里的子布局按照 XML 里定义的顺序显示在屏幕上。
所有的 Views 都会用到 android:layout_width 和 android:layout_height 这两个属性来设置自身的大小。
由于 LinearLayout 是整个视图的根布局,所以通过指定 width 和 height 属性为 "match_parent"
可以使其宽度和高度充满整个屏幕。该值表示子 View 扩张自己宽度和高度来 匹配 父控件的宽度和高度。
更多关于布局属性的内容,请参考 布局向导。
添加一个文本输入框
与其它 View 一样,我们需要定义 XML 里的某些属性来指定 EditText 的属性值。以下是应该在线性布局里指定的一些属性元素:
- 在
content_my.xml
文件的 [<LinearLayout>] 标签内定义一个 [<EditText>] 标签,并设置id
属性为@ id/edit_message
。 - 设置
layout_width
和layout_height
属性为wrap_content
。 - 设置
hint
属性为一个名为edit_message
的字符串。
代码如下:
res/layout/content_my.xml
代码语言:javascript复制<EditText android:id="@ id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
各属性说明:
android:id
这是视图的唯一标识符。可以在程序代码中通过该标识符引用对象。例如对这个对象进行读和修改的操作(在下一课里将会用到)。
当需要从 XML 里引用资源对象时,必须使用 @
符号。紧随 @
之后的是资源的类型(这里是 id
),然后是资源的名字(这里使用的是 edit_message
)。
号只在第一次定义一个资源 ID 的时候需要。它是告诉 SDK——此资源 ID 需要被创建。在应用程序被编译之后,SDK 就可以直接使用这个 ID。edit_message 是在项目文件 gen/R.java
中创建一个新的标识符,这个标识符和 EditText 关联。一旦资源 ID 被创建了,其他资源如果引用这个 ID 就不再需要
号。
android:layout_width 和 android:layout_height
不建议指定宽度和高度的具体尺寸,应使用 "wrap_content"
。因为这样可以保证视图只占据内容大小的空间。如果你使用了 "match_parent"
,这时 EditText 将会布满整个屏幕,因为它将适应父布局的大小。参见 布局向导。
android:hint
当文本框为空的时候,会默认显示这个字符串。对于字符串 "@string/edit_message"
的值所引用的资源应该定义在单独的文件里,而不是直接使用字符串。因为使用的值是存在的资源,所以不需要使用
号。当然,由于你现在还没有定义字符串,所以在添加 @string/edit_message
的时候会出现编译错误。在下一节的教程中你将学会如何定义字符串资源,到时候就不会报错了。
资源对象 资源对象是与 APP 资源(如:位图、布局文件、字符串)关联的唯一整数。 在项目文件
gen/R.java
中,每个资源都有一个与之对应的资源对象。你可以使用R
类中的对象名称代指资源(如:在指定 android:hint 属性时需要的字符串)。同时,也可以通过 android:id 属性随时为 View 创建资源 ID,以便在代码中引用这个 View。 每次编译 APP 时,SDK 工具都会生成R.java
文件。所以,请永远不要修改这个文件。 参阅 资源配备。注:该字符串资源与 ID 使用了相同的名称(
edit_message
)。然而,对于资源的引用是区分类型的(比如id
和字符串
),因此,使用相同的名称不会引起冲突。
增加字符串资源
默认情况下,你的 Android 项目包含一个字符串资源文件,即 res/values/string.xml
。打开这个文件,为 "edit_message"
增加一个定义,其值为“Enter a message”。
- 在 Android Studio 里,编辑
res/values
下的strings.xml
文件。 - 添加一个名为
"edit_message"
的字符串,值为“Enter a message”。 - 再添加一个名为
"button_send"
的字符串,值为“Send”。 下一节中将使用这个字符串创建按钮。
下边就是修改好的 res/values/strings.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My First App</string>
<string name="edit_message">Enter a message</string>
<string name="button_send">Send</string>
<string name="action_settings">Settings</string>
</resources>
当你在用户界面定义一个文本时,应该把每一个文本字符串列入资源文件。这样做的好处是:对于所有字符串值,字符串资源能够单独的修改,在资源文件里你可以很容易的找到并且做出相应的修改。通过选择定义每个字符串,还允许你用不同语言本地化 APP。
更多关于不同语言本字符串资源本地化的问题,请参考 兼容不同的设备。
添加一个按钮
- 在 Android Studio 里,编辑
res/layout
下的content_my.xml
文件。 - 在 [<LinearLayout>] 内部的 [<EditText>] 标签之后定义一个 [<Button>] 标签。
- 设置按钮的 width 和 height 属性值为
"wrap_content"
以便让按钮的大小能完整显示文字。 - 定义按钮的文本使用 android:text 属性,设置值为相似上一节中定义好的
button_send
字符串资源。
此时的 [<LinearLayout>] 看起来应该是这样:
res/layout/content_my.xml
代码语言:javascript复制<LinearLayout 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:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_my">
<EditText android:id="@ id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
</LinearLayout>
注:宽和高被设置为
"wrap_content"
,这时按钮占据的大小就是按钮里文本的大小。这个按钮不需要指定 android:id 的属性,因为 Activity 代码中不会引用该 Button。
当前 EditText 和 Button 部件只是适应了他们各自内容的大小,如图 2 所示:
图 2 EditText 和 Button 窗体小组件使用 "wrap_content"
作为宽度属性的值。
这样设置对按钮来说很合适,但是对于文本框来说就不太好了,因为用户可能输入更长的文本内容。因此如果能够占满整个屏幕宽度会更好。LinearLayout 使用 权重 属性达到这个目,即 android:layout_weight 属性。
权重的值指的是每个部件所占剩余空间的大小,该值与同级部件所占空间大小有关。这就类似于饮料的成分配方:“两份伏特加酒,一份咖啡利口酒”,即该酒中伏特加酒占三分之二。例如,我们定义一个权重为 2 的 View,另一个 View 的权重是 1,那么总数就是 3;这时第一个 View 占据 2/3 的空间,第二个占据 1/3 的空间。如果再加入第三个 View,权重设为 1,那么第一个 View(权重为 2 的)会占据 1/2 的空间,剩余的另外两个 View 各占 1/4。(请注意,使用权重的前提一般是给 View 的宽或者高的大小设置为 0dp,然后系统根据上面的权重规则来计算 View 应该占据的空间。但在很多情况下,如果给 View 设置了 match_parent 的属性,那么在计算权重时则不是通常的正比,而是反比。也就是说,权重值大的反而占据空间小)。
对于所有的 View 默认的权重是 0,如果只设置了一个 View 的权重大于 0,则该 View 将占据除去别的 View 本身占据的空间的所有剩余空间。因此这里设置 EditText 的权重为 1,使其能够占据除了按钮之外的所有空间。
让输入框充满整个屏幕的宽度
为让 EditText 充满剩余空间,做如下操作:
- 在
content_my.xml
文件里,设置 [<EditText>] 的layout_weight
属性值为1
。 - 设置 [<EditText>] 的
layout_width
值为0dp
。
res/layout/content_my.xml
代码语言:javascript复制<EditText
android:layout_weight="1"
android:layout_width="0dp"
... />
为了提升布局的效率,在设置权重时,应该把 EditText 的宽度设为 0dp。如果设置宽度为 "wrap_content"
,系统需要计算这个部件所占用的宽度;而此时的 EditText 因为设置了权重,所以会占据剩余空间;所以,最终导致的结果是:EditText 的宽度成了不起作用的属性。
设置 EditText 权重后的效果如图 3:
图 3 因 EditText 窗体小组件被设置了全部权重,所以占据了 LinearLayout 的剩余空间。
现在看一下完整的布局文件内容:
res/layout/content_my.xml
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_my">
<EditText android:id="@ id/edit_message"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
</LinearLayout>
运行应用
整个布局默认被应用于创建项目的时候 SDK 工具自动生成的 Activity,运行看下效果:
- 在 Android Studio 里,点击工具栏里的 Run 按钮。
- 或者使用命令行,进入你项目的根目录直接执行:
$ ant debug
adb install -r app/build/outputs/apk/app-debug.apk
下一小节将学习有关如何对按钮做出相应,同时读取文本中的内容,启动另外一个 Activity 等。
1.1.4启动另一个Activity
原文:http://developer.android.com/training/basics/firstapp/starting-activity.html
在完成上一课(建立简单的用户界面)后,我们已经拥有了显示一个activity(一个界面)的app(应用),该activity包含了一个文本字段和一个按钮。在这节课中,我们将添加一些新的代码到MyActivity
中,当用户点击发送(Send)按钮时启动一个新的activity。
响应Send(发送)按钮
1 在Android Studio中打开res/layout目录下的content_my.xml 文件.
2 为 Button 标签添加android:onclick属性.
res/layout/content_my.xml
代码语言:javascript复制<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
android:onclick
属性的值"sendMessage"
即为用户点击屏幕按钮时触发方法的名字。
3 打开java/com.mycompany.myfirstapp目录下MyActivity.java 文件.
4 在MyActivity.java 中添加sendMessage() 函数:
java/com.mycompany.myfirstapp/MyActivity.java
代码语言:javascript复制/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
为使系统能够将该方法(你刚在MyActivity.java中添加的sendMessage方法)与在android:onClick
属性中提供的方法名字匹配,它们的名字必须一致,特别需要注意的是,这个方法必须满足以下条件:
- 是public函数
- 无返回值
- 参数唯一(为View类型,代表被点击的视图)
接下来,你可以在这个方法中编写读取文本内容,并将该内容传到另一个Activity的代码。
构建一个Intent
Intent是在不同组件中(比如两个Activity)提供运行时绑定的对象。
Intent
代表一个应用"想去做什么事",你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个Activity。更详细的内容可以参考Intents and Intent Filters。
1 在MyActivity.java的sendMessage()
方法中创建一个Intent
并启动名为DisplayMessageActivity
的Activity:
java/com.mycompany.myfirstapp/MyActivity.java
代码语言:javascript复制Intent intent = new Intent(this, DisplayMessageActivity.class);
Note:如果使用的是类似Android Studio的IDE,这里对
DisplayMessageActivity
的引用会报错,因为这个类还不存在;暂时先忽略这个错误,我们很快就要去创建这个类了。
在这个Intent构造函数中有两个参数:
- 第一个参数是Context(之所以用
this
是因为当前Activity是Context
的子类) - 接受系统发送Intent的应用组件的Class(在这个案例中,指将要被启动的activity)。
Android Studio会提示导入Intent类。
2 在文件开始处导入Intent类:
java/com.mycompany.myfirstapp/MyActivity.java
代码语言:javascript复制import android.content.Intent;
Tip:在Android Studio中,按Alt Enter 可以导入缺失的类(在Mac中使用option return)
3 在sendMessage()
方法里用findViewById()方法得到EditText元素.
java/com.mycompany.myfirstapp/MyActivity.java
代码语言:javascript复制public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
}
4 在文件开始处导入EditText类.
在Android Studio中,按Alt Enter 可以导入缺失的类(在Mac中使用option return)
5 把EditText的文本内容关联到一个本地 message 变量,并使用putExtra()方法把值传给intent.
java/com.mycompany.myfirstapp/MyActivity.java
代码语言:javascript复制public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
}
Intent可以携带称作 extras 的键-值对数据类型。putExtra()方法把键名作为第一个参数,把值作为第二个参数。
6 在MyActivity class,定义EXTRA_MESSAGE :
java/com.mycompany.myfirstapp/MyActivity.java
代码语言:javascript复制public class MyActivity extends ActionBarActivity {
public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
...
}
为让新启动的activity能查询extra数据。定义key为一个public型的常量,通常使用应用程序包名作为前缀来定义键是很好的做法,这样在应用程序与其他应用程序进行交互时仍可以确保键是唯一的。
7 在sendMessage()函数里,调用startActivity()完成新activity的启动,现在完整的代码应该是下面这个样子:
java/com.mycompany.myfirstapp/MyActivity.java
代码语言:javascript复制/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
运行这个方法,系统收到我们的请求后会实例化在Intent
中指定的Activity
,现在需要创建一个DisplayMessageActivity
类使程序能够执行起来。
创建第二个Activity
Activity所有子类都必须实现onCreate()方法。创建activity的实例时系统会调用该方式,此时必须用 setContentView()来定义Activity布局,以对Activity进行初始化。
使用Android Studio创建新的Activity
使用Android Studio创建的activity会实现一个默认的onCreate()方法.
1.在Android Studio的java 目录, 选择包名 com.mycompany.myfirstapp,右键选择 New > Activity > Blank Activity.
2.在Choose options窗口,配置activity:
Activity Name: DisplayMessageActivity
Layout Name: activity_display_message
Title: My Message
Hierarchical Parent: com.mycompany.myfirstapp.MyActivity
Package name: com.mycompany.myfirstapp 点击 Finish.
3.打开DisplayMessageActivity.java文件,此类已经实现了onCreate()方法,稍后需要更新此方法。如果使用 Android Studio开发,现在已经可以点击Send按钮启动这个activity了,但显示的仍然是模板提供的默认内容"Hello world",稍后修改显示自定义的文本内容。
使用命令行创建activity
如果使用命令行工具创建activity,按如下步骤操作:
1 在工程的src/目录下,紧挨着MyActivity.java创建一个新文件DisplayMessageActivity.java.
2 写入如下代码:
代码语言:javascript复制public class DisplayMessageActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_display_message,
container, false);
return rootView;
}
}
}
代码语言:javascript复制Note:如果使用的IDE不是 Android Studio,工程中可能不会包含由
setContentView()
请求的activity_display_message
layout,但这没关系,因为等下会修改这个方法。
3 把新Activity的标题添加到strings.xml文件:
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
4 在 AndroidManifest.xml的Application 标签内为 DisplayMessageActivity添加 标签,如下:
代码语言:javascript复制<application ... >
...
<activity
android:name="com.mycompany.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.mycompany.myfirstapp.MyActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.mycompany.myfirstapp.MyActivity" />
</activity>
</application>
android:parentActivityName
属性声明了在应用程序中该Activity逻辑层面的父类Activity的名称。系统使用此值来实现默认导航操作,比如在Android 4.1(API level 16)或者更高版本中的Up navigation。使用Support Library,如上所示的<meta-data>
元素可以为安卓旧版本提供相同功能。
Note:我们的Android SDK应该已经包含了最新的Android Support Library,它包含在ADT插件中。但如果用的是别的IDE,则需要在 Adding Platforms and Packages 中安装。当Android Studio中使用模板时,Support Library会自动加入我们的工程中(在Android Dependencies中你以看到相应的JAR文件)。如果不使用Android Studio,就需要手动将Support Library添加到我们的工程中,参考setting up the Support Library。
接收Intent
不管用户导航到哪,每个Activity都是通过Intent被调用的。我们可以通过调用getIntent()来获取启动activity的Intent及其包含的数据。
1 编辑java/com.mycompany.myfirstapp目录下的DisplayMessageActivity.java文件.
2 得到intent 并赋值给本地变量.
代码语言:javascript复制Intent intent = getIntent();
3 为Intent导入包.
在Android Studio中,按Alt Enter 可以导入缺失的类(在Mac中使用option return).
4 调用 getStringExtra()提取从 MyActivity 传递过来的消息.
代码语言:javascript复制String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
显示文本
1 在res/layout目录下,编辑文件content_display_message.xml
.
2 为标签添加id属性,你之后需要用这个id属性来调用这个对象.
代码语言:javascript复制< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:id="@ id/content">
</RelativeLayout>
3 重新来编辑DisplayMessageActivity.java
4 在onCreate()
方法中创建一个对象TextView
TextView textView = new TextView(this);
5 用setText()
来设置文本字体大小和内容.
textView.setTextSize(40);
textView.setText(message);
6 将TextView
加入之前被标记为R.id.content
的RelativeLayout
中
RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
layout.addView(textView);
7 为TextView 导入包.
在Android Studio中,按Alt Enter 可以导入缺失的类(在Mac中使用option return).
DisplayMessageActivity的完整onCreate()方法应该如下:
代码语言:javascript复制@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null)
.show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Intent intent = getIntent();
String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
layout.addView(textView);
}
现在你可以运行app,在文本中输入信息,点击Send(发送)按钮,ok,现在就可以在第二Activity上看到发送过来信息了。如图:
- 到此为止,已经创建好我们的第一个Android应用了!