【谷歌官方文档】1.1 建立第一个APP

2019-08-09 19:04:44 浏览数 (1)

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 NameMyActivity,修改 Layout Nameactivity_myTitle 修改为MyActivityMenu 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设备,以下的步骤可以使我们在自己的设备上安装和运行应用程序:

手机设置

  1. 把设备用USB线连接到计算机上。如果是在windows系统上进行开发的,你可能还需要安装你设备对应的USB驱动,详见OEM USB Drivers 文档。
  2. 开启设备上的USB调试选项。
    • 在大部分运行Andriod3.2或更老版本系统的设备上,这个选项位于“设置>应用程序>开发选项”里。
    • 在Andriod 4.0或更新版本中,这个选项在“设置>开发人员选项”里。

Note: 从Android4.2开始,开发人员选项在默认情况下是隐藏的,想让它可见,可以去设置>关于手机(或者关于设备)点击版本号七次。再返回就能找到开发人员选项了。

从Android Studio运行程序

  1. 选择项目的一个文件,点击工具栏里的Run按钮。
  2. 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中,执行:

代码语言:javascript复制
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

  1. 在 Android Studio 中,从 res/layout 目录打开 content_my.xml 文件。 上一节创建新项目时生成的 BlankActivity 包含一个 content_my.xml 文件,该文件根元素是一个包含 TextView 的 RelativeLayout。
  2. Preview 面板点击关闭右侧 Preview 面板。
  3. 在 Android Studio 中打开布局文件时,可以看到一个 Preview 面板。点击这个面板中的标签,可利用 WYSIWYG(所见即所得)工具在 Design 面板看到对应的图形化效果。但在本节中,我们将学习如何直接修改 XML 文件。
  4. 删除 [<TextView>] 标签。
  5. 把 [<RelativeLayout>] 标签改为 [<LinearLayout>]。
  6. 为 [<LinearLayout>] 添加 android:orientation 属性并设置值为 "horizontal"
  7. 去掉 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 的属性值。以下是应该在线性布局里指定的一些属性元素:

  1. content_my.xml 文件的 [<LinearLayout>] 标签内定义一个 [<EditText>] 标签,并设置 id 属性为 @ id/edit_message
  2. 设置 layout_widthlayout_height 属性为 wrap_content
  3. 设置 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”。

  1. 在 Android Studio 里,编辑 res/values 下的 strings.xml 文件。
  2. 添加一个名为 "edit_message" 的字符串,值为“Enter a message”。
  3. 再添加一个名为 "button_send" 的字符串,值为“Send”。 下一节中将使用这个字符串创建按钮。

下边就是修改好的 res/values/strings.xml

代码语言:javascript复制
<?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。

更多关于不同语言本字符串资源本地化的问题,请参考 兼容不同的设备。

添加一个按钮

  1. 在 Android Studio 里,编辑 res/layout 下的 content_my.xml 文件。
  2. 在 [<LinearLayout>] 内部的 [<EditText>] 标签之后定义一个 [<Button>] 标签。
  3. 设置按钮的 width 和 height 属性值为 "wrap_content" 以便让按钮的大小能完整显示文字。
  4. 定义按钮的文本使用 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 充满剩余空间,做如下操作:

  1. content_my.xml 文件里,设置 [<EditText>] 的 layout_weight 属性值为 1
  2. 设置 [<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;
        }
    }
}

Note:如果使用的IDE不是 Android Studio,工程中可能不会包含由setContentView()请求的activity_display_message layout,但这没关系,因为等下会修改这个方法。

3 把新Activity的标题添加到strings.xml文件:

代码语言:javascript复制
<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

代码语言:javascript复制
TextView textView = new TextView(this);

5 用setText()来设置文本字体大小和内容.

代码语言:javascript复制
textView.setTextSize(40);
textView.setText(message);

6 将TextView加入之前被标记为R.id.contentRelativeLayout

代码语言:javascript复制
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应用了!

0 人点赞