黑马程序员技术交流社区

标题: 启动另一个活动 [打印本页]

作者: 龚正军    时间: 2013-5-2 10:49
标题: 启动另一个活动
本帖最后由 龚正军 于 2013-5-2 12:19 编辑

在这节课中,你将会添加一些新的代码到MyFirstActivity中,当用户点击发送(Send )按钮时启动一个新的activity
Respond to the Send Button-响应Send(发送)按钮
响应按钮的on-click(点击)事件,打开activity_main.xml布局文件然后在Button(按钮)元素中添加android: onclick属性:

   

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


android: onclick属性的值:sendMessage就是当用户点击你屏幕按钮时触发方法的名字。
添加相应的方法在MyFirstActivity类中:

   

/* *  当用户点击Send按钮时调用 * /    public void sendMessage(View
view) {    // 做一些相应按钮的操作    }


注意:在Eclipse中,按Ctrl + Shift + O 可以导入缺失的类(在Mac中使用Cmd + Shift + O )*
请注意,为了让系统能够将这个方法(你刚在MyFirstActivity中添加的sendMessage方法)与在android: onClick属性中提供的方法名字匹配,它们的名字必须一致,特别是,这个方法必须满足以下条件:
接下来,你可以在这个方法中编写读取文本内容的代码,并将该内容传到另一个Activity
Intent(意图)是在不同组件中提供运行时连接的对象(比如两个Activity)。Intent(意图)代表一个应用"想去做什么事",你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个Activity。在sendMessage()方法中创建一个Intent(意图)并启动名为DisplayMessageActivity的Activity:

Intent intent = new Intent(this, DisplayMessageActivity.class);
在这个Intent构造函数中有两个参数:
第一个参数是Context(上下文)(之所有可以用this是因为当前Activity(MyFirstActivity)是Context的子类)
系统需要传递Intent的应用组件的class对象(在这个案例中,这个activity应该被启动)
注意:如果你正在使用的是类似Eclipse的IDE,这里对DisplayMessageActivity的引用会报错,因为这个类还不存在;注意这个错误,你很快就要去创建这个类了。


一个Intent(意图)不仅允许你启动另一个Activity,同时也可以传递一个数据包到另一个Activity,ok,用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);


Sending an intent to other apps-发送intent(意图)到其他app(应用)

在这课中创建的Intent(意图)包含了一个非常明确的意图,因为它指定了一个Intent需要的精确app(应用)组件;
然而,在Intent没有指定明确的组件时,Intent(意图)是隐式的,但它允许安装在设备上的任何应用来回应,
只要这个应用满足在各个Intent(意图)参数中指定的action(行动)的元数据规范,想了解更多信息,
可以去看Interacting with Other Apps课程
Intent(意图)可以传递各种各样的以键值对形式出现的集合,可以称它为extras,putExtra()方法用字符串作为它的key,第二个参数作为它的值为了在下一个Activity中获取extra(附加的)数据,你应该定义一个公共常量作为key(键),ok,在MyFirstActivity类的顶部定义一个名为EXTRA_MESSAGE的常量:

   

public class MyFirstActivity extends Activity {    public final static
String EXTRA_MESSAGE = "com.example.myapp.MESSAGE";    ...  
  }


为使extras键唯一,使用你应用的包名作为extras键的前缀是一个很好的做法,因为你的应用可能需要跟其他应用交互。
启动一个Activity,你只需要调用startActivity()方法然后传入你的Intent(意图)系统接收到你的请求后会实例化在Intent中指定的Activity,包含这个方法拥有的,被Send(发送)按钮调用的完整sendMessage()方法现在就像这样:

   

/* *  当用户点击Send按钮时调用 * /   
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支持程序能够执行起来
在你的项目中,在src//路径下新建一个名为DisplayMessageActivity.java的类。
:在Eclipse中,在src/路径下点鼠标右键选中New > Class,输入DisplayMessageActivity,并且指定继承android.app.Activity 。
在这个类中,添加onCreate()回调方法:

public class DisplayMessageActivity extends Activity {@Overridepublic void
onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);     
        }  }


所有Activity的子类都必须实现onCreate()方法,当系统创建Activity实例时就会调用该方法,这个方法是你必须定义activity布局以及初始化必要activity组件的地方。
Add it to the manifest-将Activity加入manifest(清单)文件你必须在manifest(清单)文件,AndroidManifest.xml中使用元素声明你所有的Activity;因为DisplayMessageActivity是由一个明确的Intent(意图)调用的,所以它不需要任何intent filters(意图过滤器)(intent filters,你可以在manifest文件中声明MyFirstActivity的地方看到)如此DisplayMessageActivity就可以在元素中用一句很简单的代码声明;

<application ... ><activity
android:name="com.example.myapp.DisplayMessageActivity"
/>...</application>


这个app(应用)现在就可以运行了,因为第一个Activity中的Intent现在可以解析DisplayMessageActivity类了,如果你现在运行app,点击Send(发送)按钮启动,第二个Activity,它不会显示任何东西;
每一个被Intent调用的Activity,不管用户将它导航到哪,你都可以在启动的Activity中通过getIntent()方法得到Intent以及Intent包含的数据。在DisplayMessageActivity类的onCreate()方法中,得到intent以及MyFirstActivity提供的附加信息:

   

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


在屏幕上显示信息,创建一个TextView部件,并且使用setText()设置它的值,然后通过setContentView()方法将TextView作为root(根)视图添加到Activity的布局。
DisplayMessageActivity完整的onCreate()方法现在看起来如下:

   

@Override   
public void onCreate(Bundle savedInstanceState) {  
  super.onCreate(savedInstanceState);    // 从intent中获取信息  
  Intent intent = getIntent();    String message =
intent.getStringExtra(MyFirstActivity.EXTRA_MESSAGE);    // 创建TextView对象   
TextView textView = new TextView(this);   
textView.setTextSize(40);   
textView.setText(message);   
setContentView(textView);}


现在你可以运行app,在文本中输入信息,点击Send(发送)按钮,ok,现在就可以在第二Activity上看到信息了。

如图:两个Activity在同一个应用中,运行在Android4.0的版本上
ok,你已经创建你的第一个Android应用了!

作者: fjl_fight    时间: 2013-5-3 13:06
学习了!!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2