编写: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按照向导完成安装步骤。
1. 使用Android Studio创建Android项目,启动Android Studio。
2. 参照图1在弹出的窗口(Configure your new project)中填入内容,点击Next。按照如图所示的值进行填写会使得后续的操作步骤不不容易差错。
图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设置:
更多关于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. 执行:
tools/android list targets
会在屏幕上打印出我们所有的Android SDK中下载好的可用Android platforms,找想要创建项目的目标platform,记录该platform对应的Id,推荐使用最新的platform。我们仍可以使自己的应用支持较老版本的platform,但设置为最新版本允许我们为最新的Android设备优化我们的应用。如果没有看到任何可用的platform,我们需要使用Android SDK Manager完成下载安装,参见 Adding Platforms and Packages。
3. 执行:
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”程序,包含了一些默认的文件。要运行它,继续下个小节的学习。
编写:yuanfentiank789 - 原文:http://developer.android.com/training/basics/firstapp/running-app.html
通过上一节课创建了一个Android的Hello World项目,项目默认包含一系列源文件,它让我们可以立即运行应用程序。
如何运行Android应用取决于两件事情:是否有一个Android设备和是否正在使用Android Studio开发程序。本节课将会教使用Android Studio和命令行两种方式在真实的android设备或者android模拟器上安装并且运行应用。
如果有一个真实的Android设备,以下的步骤可以使我们在自己的设备上安装和运行应用程序:
Note: 从Android4.2开始,开发人员选项在默认情况下是隐藏的,想让它可见,可以去设置>关于手机(或者关于设备)点击版本号七次。再返回就能找到开发人员选项了。
Android Studio 会把应用程序安装到我们的设备中并启动应用程序。
打开命令行并切换当前目录到Andriod项目的根目录,在debug模式下使用Gradle编译项目,使用gradle脚本执行assembleDebug编译项目,执行后会在build/目录下生成MyFirstApp-debug.apk。
Windows操作系统下,执行:
gradlew.bat assembleDebug
Mac OS或Linux系统下:
$ 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 模拟器的配置,可以让我们模拟不同的设备。
1. 启动 Android Virtual Device Manager(AVD Manager)的两种方式:
* 用Android Studio, **Tools > Android > AVD Manager**,或者点击工具栏里面Android Virtual Device Manager![image](avd-manager-studio.png);
* 在命令行窗口中,把当前目录切换到`<sdk>/tools/` 后执行:
android avd
2. 在AVD Manager 面板中,点击Create Virtual Device.
3. 在Select Hardware窗口,选择一个设备,比如 Nexus 6,点击Next。
4. 选择列出的合适系统镜像.
5. 校验模拟器配置,点击Finish。
更多AVD的知识请阅读Managing AVDs with AVD Manager.
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. 执行如下命令:
adb install app/build/outputs/MyFirstApp-debug.apk
4. 在模拟器上找到MyFirstApp,并运行。
以上就是创建并在设备上运行一个应用的全部过程!想要开始开发,点击next lesson。
编写: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 中定义界面布局,而不是在运行时动态生成布局。其中最重要的一点是——这可以让你为不同大小的屏幕创建不同的布局文件。例如,你可以创建两个版本的布局文件,告诉系统在小屏幕上使用其中一个布局文件,在大屏幕上使用另外一个布局文件。参见 兼容不同的设备。
res/layout
目录打开 content_my.xml
文件。
上一节创建新项目时生成的 BlankActivity 包含一个 content_my.xml
文件,该文件根元素是一个包含 TextView 的 RelativeLayout。"horizontal"
。android:padding
属性和 tools:context
属性。修改后结果如下:
res/layout/content_my.xml
<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
<EditText android:id="@+id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
各属性说明:
这是视图的唯一标识符。可以在程序代码中通过该标识符引用对象。例如对这个对象进行读和修改的操作(在下一课里将会用到)。
当需要从 XML 里引用资源对象时,必须使用 @
符号。紧随 @
之后的是资源的类型(这里是 id
),然后是资源的名字(这里使用的是 edit_message
)。
+
号只在第一次定义一个资源 ID 的时候需要。它是告诉 SDK——此资源 ID 需要被创建。在应用程序被编译之后,SDK 就可以直接使用这个 ID。edit_message 是在项目文件 gen/R.java
中创建一个新的标识符,这个标识符和 EditText 关联。一旦资源 ID 被创建了,其他资源如果引用这个 ID 就不再需要 +
号。
不建议指定宽度和高度的具体尺寸,应使用 "wrap_content"
。因为这样可以保证视图只占据内容大小的空间。如果你使用了 "match_parent"
,这时 EditText 将会布满整个屏幕,因为它将适应父布局的大小。参见 布局向导。
当文本框为空的时候,会默认显示这个字符串。对于字符串 "@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”。
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。
更多关于不同语言本字符串资源本地化的问题,请参考 兼容不同的设备。
res/layout
下的 content_my.xml
文件。"wrap_content"
以便让按钮的大小能完整显示文字。button_send
字符串资源。此时的 [<LinearLayout>] 看起来应该是这样:
res/layout/content_my.xml
<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
。layout_width
值为 0dp
。res/layout/content_my.xml
<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
<?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,运行看下效果:
$ ant debug
adb install -r app/build/outputs/apk/app-debug.apk
下一小节将学习有关如何对按钮做出相应,同时读取文本中的内容,启动另外一个 Activity 等。
原文:http://developer.android.com/training/basics/firstapp/starting-activity.html
在完成上一课(建立简单的用户界面)后,我们已经拥有了显示一个activity(一个界面)的app(应用),该activity包含了一个文本字段和一个按钮。在这节课中,我们将添加一些新的代码到MyActivity
中,当用户点击发送(Send)按钮时启动一个新的activity。
1 在Android Studio中打开res/layout目录下的content_my.xml 文件.
2 为 Button 标签添加android:onclick属性.
res/layout/content_my.xml
<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
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
为使系统能够将该方法(你刚在MyActivity.java中添加的sendMessage方法)与在android:onClick
属性中提供的方法名字匹配,它们的名字必须一致,特别需要注意的是,这个方法必须满足以下条件:
接下来,你可以在这个方法中编写读取文本内容,并将该内容传到另一个Activity的代码。
Intent是在不同组件中(比如两个Activity)提供运行时绑定的对象。
Intent
代表一个应用"想去做什么事",你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个Activity。更详细的内容可以参考Intents and Intent Filters。
1 在MyActivity.java的sendMessage()
方法中创建一个Intent
并启动名为DisplayMessageActivity
的Activity:
java/com.mycompany.myfirstapp/MyActivity.java
Intent intent = new Intent(this, DisplayMessageActivity.class);
Note:如果使用的是类似Android Studio的IDE,这里对
DisplayMessageActivity
的引用会报错,因为这个类还不存在;暂时先忽略这个错误,我们很快就要去创建这个类了。
在这个Intent构造函数中有两个参数:
this
是因为当前Activity是Context
的子类)Android Studio会提示导入Intent类。
2 在文件开始处导入Intent类:
java/com.mycompany.myfirstapp/MyActivity.java
import android.content.Intent;
Tip:在Android Studio中,按Alt + Enter 可以导入缺失的类(在Mac中使用option + return)
3 在sendMessage()
方法里用findViewById()方法得到EditText元素.
java/com.mycompany.myfirstapp/MyActivity.java
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
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
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
/** 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所有子类都必须实现onCreate()方法。创建activity的实例时系统会调用该方式,此时必须用 setContentView()来定义Activity布局,以对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 写入如下代码:
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文件:
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
4 在 AndroidManifest.xml的Application 标签内为 DisplayMessageActivity添加 标签,如下:
<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。
不管用户导航到哪,每个Activity都是通过Intent被调用的。我们可以通过调用getIntent()来获取启动activity的Intent及其包含的数据。
1 编辑java/com.mycompany.myfirstapp目录下的DisplayMessageActivity.java文件.
2 得到intent 并赋值给本地变量.
Intent intent = getIntent();
3 为Intent导入包.
在Android Studio中,按Alt + Enter 可以导入缺失的类(在Mac中使用option + return).
4 调用 getStringExtra()提取从 MyActivity 传递过来的消息.
String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
1 在res/layout目录下,编辑文件content_display_message.xml
.
2 为标签添加id属性,你之后需要用这个id属性来调用这个对象.
< 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()方法应该如下:
@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上看到发送过来信息了。如图: