`

启动另一个Activity(翻译)

 
阅读更多

启动另一个Activity

在你完成前面的课程后,你已经有一个App显示一个Activity(一个屏幕),屏幕上有一个文本域和一个按钮。在这个课程,你将在MainActivity中增加一些代码,当用户点击这个发送按钮时启动另一个Activty。

响应发送按钮

为了响应按钮的鼠标单击事件,打开activity_main.xml布局文件,在<Button>元素上增加android:onClick属性。

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

 android:onClick属性的值“sendMessage”是用户单击鼠标时系统调用的在你的activity中的方法名。

打开MainActivity类(在工程的src/目录下)然后增加对应的方法。

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}

 这要求你导入View类。

import android.view.View;

 提示:在Eclipse中,按Ctrl+Shift+O自动导入缺少的类(mac上是Cmd+Shift+O)。

为了让系统能够将这个方法匹配到android:onClick给定的方法名,方法签名必须和所展示的完全一样。明确的,这个方法必须:

  • 是public的
  • 返回值是void类型
  • 只有一个View作为它的唯一参数(这个View就是被点击的View)

接下来你将会补充这个方法来读取文本域的内容并将那个文本传递到另一个Activity。

构建一个Intent

Intent是一个在两个不同的组件(比如两个Activity)之间提供运行时绑定的对象。Intent表示一个app的“想要做什么事”。你能使用Intent完成各种各样的任务,但它们最常被用于启动另一个Activity。

在sendMessage方法内,创建一个Intent来启动一个名为DisplayMessageActivity的Activity。

 

Intent intent = new Intent(this, DisplayMessageActivity.class);
 这里使用的构造器使用两个参数:

 

 

  • 一个Context作为它的第一个参数(使用this是因为Activity类是Context类的一个子类)
  • app组件的类(Class),系统应该分发这个Intent到这个类(在这个例子中,是那个应该启动的Activity)。
注意:如果你使用IDE的话,如Eclipse,则DisplayMessageActivity的引用会产生一个错误,因为这个类现在还不存在。现在请忽略这个错误,因为你马上就会创建这个类。

 

一个Intent不仅允许你启动另一个Activity,它同样也能携带一些数据给那个activity。在sendMessage方法内部,使用findViewById()来获取EditText元素,并将它的文本值添加到Intent。

 

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);
 注意:你需要导入语句为android.content.Intent和android.widget.EditText。你很快就将定义EXTRA_MESSAGE常量。

 

一个Intent可以携带一堆各种各样的数据,类型为键值对,称为extra。pubExtra()使用键的名字作为第一个参数,值作为第二个参数。

为了让另一个Activity可以查询数据,你应该使用一个public常量为你的Intent的extra定义键,因此将EXTRA_MESSAGE的定义添加在MainActivity类的顶部。

 

public class MainActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...
}
使用app的包名作为intent的extra的键的前缀通常是一个好的实践。这个可以保证它们是唯一的。否则你的app会同其他app交互。

 

启动第二个Activity

为了启动一个Activity,调用startActivity()然后将你的Intent传递给它。系统接收到这个调用,然后启动一个Intent中指定的Activity的实例。

使用这些代码,发送按钮所调用的完整的sendMessage()方法现在看着如下所示:

 

/** 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);
}
 现在你需要去创建DisplayMessageActivity类从而使这个可以工作。

 

创建第二个Activity

使用Eclipse创建一个新的Activity:

  1. 点击工具栏中的新建。
  2. 在弹出的窗口中选择Android文件夹然后选择Android Actitivy,点击下一步。
  3. 选择BlankActivity,点击下一步。
  4. 填满Activity的细节,如下所示

 最后点击完成。
打开DisplayMessageActivity.java文件,如果你使用Eclipse创建这个Activity:
  • 这个类已经包含一个需要的onCreate()方法的实现
  • 同样有一个onCreateOptionsMenu()方法的实现,但是你在这个app里面将不会需要它,因此你将它删除。
  • 同样有一个onOptionsItemSelected()方法的实现,它处理工具栏向上的操作,保持原样。
因为ActionBar这个接口只在HONEYCOMB(API等级11)及以上才有,你必须在getActionBar的附近添加一个条件来检查当前平台的版本。另外,你必须在onCreate()方法这里添加@SuppressLint("NewApi")标签来避免lint错误。
DisplayMessageActivity类现在看起来应该是这样的:
public class DisplayMessageActivity extends Activity {

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);

        // Make sure we're running on Honeycomb or higher to use ActionBar APIs
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // Show the Up button in the action bar.
            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
 如果你是使用Eclipse以外的IDE,请使用上面的代码更新你的DisplayMessageActivity类。
所有Activity的子类都必须实现onCreate()方法。当创建一个Activity的新实例时系统就会调用这个方法。这个方法是你必须使用setContentView()方法定义Activity布局的地方,也是你应该为Activity组件执行初始设置的地方。
注意:如果你使用Eclipse以外的IDE,你的工程不会包含activity_display_message布局,而这个布局是setContentView()所需要的。但这个没问题,因为后面会更新这个方法,并且不会用到这个布局。

增加标题字符串

如果你使用Eclipse,可以直接跳到下一部分,因为模板会提供新的Activity的标题字符串。

如果你使用Eclipse以外的IDE,添加新的Activity标题到string.xml文件中:

 

<resources>
    ...
    <string name="title_activity_display_message">My Message</string>
</resources>

 

 

将这个添加到manifest中

所有的Activity都必须在manifest文件中被声明,AndroidManifest.xml,使用<activity>元素。

当你使用Eclipse工具来创建activity,它会创建一个默认的实例。如果你使用其他的IDE,你需要自己添加manifest实例。它看着应该是这样的:

 

<application ... >
    ...
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

 android:parentActivityName属性声明在app的逻辑层次中这个Activity的父Activity的名字。系统使用这个值来实现默认的导航行为,例如向上(UP navigation),在4.1(API 16)及以上版本提供。你可以为老版本的Android提供同样的导航行为通过使用支持库(support library)并像这里一样添加<meta-data>元素。

 

注意:你的Android SDK应该已经包含最新版本的Android Support Library。它和ADT Bundle包含在一起,但是如果你使用的是其他的IDE,你应该已经在Adding Platforms and Packages那一步安装了。当使用Eclipse的模板时,支持库已经自动被添加到app的工程中了(你可以在Android Dependencies看到这个库的JAR文件)。如果你不是使用的Eclipse,你需要手动的添加这个库到你的工程中——根据setting up the Support Library指导,然后回到这里。

如果你使用Eclipse开发,你现在已经可以运行这个app了,但是不会发生什么。点击发送按钮启动第二个Activity,但是它用默认的模板提供的“Hello world”布局。你马上就将更新这个Activity,显示一个定制的文本视图,因此如果你使用另外的IDE,不要担心这个app现在还不能编译的问题。

接收这个Intent

每一个Activity都是被一个Intent调用的,不管用户如何导航到那里的。你可以通过调用getIntent()获取启动你的Activity的Intent,然后取回包含在其中的数据。

在DisplayMessageActivity类的onCreate()方法中,获取这个Intent并提取出MainActivity分发过来的消息。

 

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

 

显示消息

为了在屏幕上显示这个消息,创建一个TextView组件并使用setText()设置文本。然后通过setContentView()方法添加这个TextView作为这个Activity布局的根视图。

DisplayMessageActivity类的完整的onCreate()方法现在看着如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}

 你现在可以运行你的APP了。当它打开时,在文本域输入消息,点击发送,然后这个消息在Activity中显示出来。



 就这些了,你已经构建了你的第一个Android app了。

学习更多的关于构建Android app的课程,继续学习基础培训课程。下一课是管理Activity的生命周期(Managing the Activity Lifecycle)。

 

 

  • 大小: 43.8 KB
  • 大小: 32.5 KB
分享到:
评论

相关推荐

    Activity启动流程思维导图

    Activity启动流程思维导图,详细整理了activity启动的逻辑,使人快速看清activity的启动逻辑。个人整理的东西,可能存在很多瑕疵,如有瑕疵,不是巧合。

    Android开发指南.rar

    从英文开发资料Android Development Guide一文应用程序框架部分的翻译,覆盖了Android应用开发所有主要的概念。目录 关键类 3 应用程序组件 3 激活组件:intent 5 关闭组件 6 manifest文件 6 Intent过滤...

    google android sdk开发范例大全 第二版 PDF 光盘代码

     3.9 调用另一个Activity   3.10 不同Activity之间的数据传递   3.11 返回数据到前一个Activity   3.12 具有交互功能的对话框   3.13 置换文字颜色的机关   3.14 控制不同的文字字体   ...

    Android简单音乐播放实例

    Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,例如我们打开一个音乐播放器来听音乐,在听音乐的...

    Android使用Service实现简单音乐播放实例

     Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,例如我们打开一个音乐播放器来听音乐,在听音乐的...

    Android 编程 andbook 中文版

    文中的Activity启动,由于是m5版本,方法已经不适用了,在此以Android SDK1.5的方法来重新编写了java文件。修正适用于SDK1.5或SDK1.1。该译本仅供学习交流,如有翻译不当的地方,请高人指教,谢谢。

    Google Android SDK开发范例大全(第3版)part2

     3.9 调用另一个Activity  3.10 不同Activity之间的数据传递  3.11 返回数据到前一个Activity  3.12 具有交互功能的对话框  3.13 置换文字颜色的机关  3.14 控制不同的文字字体  3.15 如iPhone拖动相片...

    《Google Android SDK开发范例大全(第3版)》.pdf

    3.9 调用另一个activity 37 3.10 不同activity之间的数据传递 41 3.11 返回数据到前一个activity 44 3.12 具有交互功能的对话框 49 3.13 置换文字颜色的机关 51 3.14 控制不同的文字字体 52 3.15...

    详解Android进程和线程

    一个Android应用就是一个Linux进程,每个应用在各自的进程中运行,互不干扰,比较安全。 一个应用对应一个主线程,就是通常所说的UI线程,android遵守的就是单线程模型,所以说Ui操作不是线程安全的并且这些操作必须...

    Google Android SDK开发范例大全(第3版) 1/5

    3.9 调用另一个Activity 3.10 不同Activity之间的数据传递 3.11 返回数据到前一个Activity 3.12 具有交互功能的对话框 3.13 置换文字颜色的机关 3.14 控制不同的文字字体 3.15 如iPhone拖动相片特效 3.16 自制计算器...

    Google Android SDK开发范例大全(第3版) 4/5

    3.9 调用另一个Activity 3.10 不同Activity之间的数据传递 3.11 返回数据到前一个Activity 3.12 具有交互功能的对话框 3.13 置换文字颜色的机关 3.14 控制不同的文字字体 3.15 如iPhone拖动相片特效 3.16 自制计算器...

    Google Android SDK开发范例大全(第3版) 3/5

    3.9 调用另一个Activity 3.10 不同Activity之间的数据传递 3.11 返回数据到前一个Activity 3.12 具有交互功能的对话框 3.13 置换文字颜色的机关 3.14 控制不同的文字字体 3.15 如iPhone拖动相片特效 3.16 自制计算器...

    Google Android SDK开发范例大全(第3版) 5/5

    3.9 调用另一个Activity 3.10 不同Activity之间的数据传递 3.11 返回数据到前一个Activity 3.12 具有交互功能的对话框 3.13 置换文字颜色的机关 3.14 控制不同的文字字体 3.15 如iPhone拖动相片特效 3.16 自制计算器...

    android开发资料大全

    Android数据库最基础的一个例子(本人已测试,可以运行) 为launcher添加一个仿Mac的dock(附源码) 使用Gallery实现Tab 仿QQ--tab切换动画实例 Android 小项目之---猜扑克牌游戏 (附源码) fleep滑动切换tab(切换...

    计步器的实现

    android计步器的实现,自定义的一个弧形进度条,记步通过手机的传感器来实现,也就是说不支持传感器的机子(应该很老的了吧)就没有效果。看看效果图: 这里写图片描述这里写图片描述 自定义View public class ...

    精通ANDROID 3(中文版)1/2

    20.3.5 使用索引添加另一个三角形  20.3.6 为简单的OpenGL三角形制作动画  20.4 OpenGL的运用:形状和纹理  20.4.1 绘制矩形  20.4.2 使用形状  20.4.3 使用纹理  20.4.4 绘制多个图形  20.5 OpenGL ...

    精通Android 3 (中文版)2/2

    20.3.5 使用索引添加另一个三角形  20.3.6 为简单的OpenGL三角形制作动画  20.4 OpenGL的运用:形状和纹理  20.4.1 绘制矩形  20.4.2 使用形状  20.4.3 使用纹理  20.4.4 绘制多个图形  20.5 OpenGL ...

Global site tag (gtag.js) - Google Analytics