1.4 启动另一个activity

http://developer.android.com/training/basics/firstapp/starting-activity.html

完成上一章节的课程之后,开发者创建的应用软件显示了包含一个文本框和一个按钮的activity。本节中,开发者将向MainActivity添加一些代码,使得用户按下按钮时启动一个新的activity。

响应send按钮

为了使按钮的点击事件得到响应,在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可以快速添加未定义的类。

为了让系统将这个方法与android:onClick属性设置的值相关联,这个方法必须满足如下条件:

  • 声明为public
  • 返回值为void
  • 拥有唯一一个View类型的参数(即被点击的View)

接下来,开发者将赋予这个方法具体行为,读出文本框的内容并将其发送给另一个activity。

创建Intent

Intent对象用于将两个独立的部件(如两个activity)在运行时相关联,代表了应用软件的“行为意图”。Intent可被用来实现多种任务,但最为典型的还是启动一个新的activity。

在SendMessage()方法中,创建一个Intent对象,用于启动一个名为DisplayMessageActivity的Activity对象:

Intent intent = new Intent(this, DisplayMessageActivity.class);

Intent的构造函数使用了两个参数:

  • 第一个参数为Context类型,this指向的activity是Context的派生类
  • 第二个参数为Intent传递目标的Class类型,本例中为将要被启动的activity的class类型

注意:在Eclipse及其他一些集成开发环境中,由于目前还没有DisplayMessageAcitivity的定义,对其引用会导致错误,后续章节将添加这个对象的定义。

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也需要在后续步骤中添加。

Inten对象可以包含一些命名为extras的键-值对数据,调用putExtra()方法将键名作为第一个参数,值作为第二个参数。

为了使另一个activity获取到这些额外数据,键值对使用的键值应该定义为public常量。因此在MainAcitivity类定义的开头处添加了EXTRA_MESSAGE的定义。

public classMainActivity extendsActivity { 
   
public finalstatic String EXTRA_MESSAGE= "com.example.myfirstapp.MESSAGE"; 
   
... 
}

使用package名称作为intent数据对的键名前缀是一个不错的选择,这样就能够保证变量名的唯一性,从而避免与其他应用软件发生冲突。

启动另一个Activity

使用Intent对象作为参数调用startActivity()即可启动另一个Activity。系统检测到这个调用,就会启动一个由Intent对象指定的Activity实例。

由send按钮触发的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); 
}

接下来创建DisplayMessageAcitivity类以完成这项完整的工作。

创建另一个Activity

使用Eclipse创建activity步骤如下:

1. 点击工具栏的New按钮;

2. 在弹出窗口中,选择Android文件夹,选中Android Activity后点击Next;

3. 选择BlankAcitivity点击Next;

4. 填写activity的详细信息:

       Project: MyFirstApp

       Activity Name: DisplayMessageAcitivity

       Layout Name: activity_display_message

       Title: My Message

       Hierarchial Parent: com.example.myfirstapp.MainActivity

       Navigation Type: None

点击Finish

如果开发者使用的是其他IDE或者命令行工具,在project src目录下紧接着MainActivity.java文件,创建文件DisplayMessageAcitivity.java。

打开DisplayMessageActivity.java文件,如果是Eclipse环境:

这个class已经自动包含了OnCreate()方法的实现;

删除缺省的onCreateOptionsMenu()方法,因为这个方法在本例中不需要;

保留缺省的onOptionsItemSelected()方法,用于处理action栏上Up的事件;

由于只有HONEYCOMB(API Level 11)以上的版本才支持ActionBar的API,使用getActionBar()方法必须添加确认当前平台版本的条件语句。此外,onCreate()方法还需要添加@SuppressLint("NewApi")标签以避免静态代码检查(lint)错误。

完成后的DisplayMessageActivity类的代码如下所示:

public classDisplayMessageActivity extendsActivity { 
 
   
@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); 
   
} 
}

如果开发者使用的是其他IDE,略

添加标题字符串

在Eclipse环境,模板自动为新建的activity定义了标题字符串,本节可直接跳过

添加Activity到Manifest

所有使用的activity必须以<activity>元素的形式添加到AndroidManifest.xml文件。在Eclipse环境,系统会自动为开发者创建一个默认的条目,代码如下:

<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属性定义了本activity在应用软件逻辑架构中的父activity,android系统基于这个属性来确定缺省的导航行为,如android 4.1及以上版本提供的Up导航。开发者也可以利用支撑库并参照此处代码添加<meta-data>元素,在更早的android系统中实现此功能。

注意:开发者需确保SDK中包含最新的支撑库,支撑库包含在ADT中,如果开发者使用非Eclipse IDE环境,在添加平台和包的步骤中,需要安装此项。如果使用的Eclipse,支撑库会自动加入到应用软件工程之中(Android依赖项下面会显示支撑库的JAR文件),而非Eclipse环境,则需要参照安装支撑库说明手动将支撑库添加到工程。

对于Eclipse环境,现在即可运行软件,虽然不会呈现任何更多的效果。点击Send按钮,启动了第二个activity,然而显示的是模板提供的"hello world"界面布局。接下来,要让activity显示定制的文本内容。

接收Intent

所有的Activity都是由Intent触发的,通过getIntent()可以获取相应的Intent对象,并且获得Intent包含的数据。

在DisplayMessageActivity类的onCreate()方法中,获取Intent以及Activity传入的消息:

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

显示消息

为了将消息显示到屏幕,创建一个TextView部件,使用setText()设置文本内容。接着,将这个TextView传递给setContentView()使之成为activity界面的根View。

完成的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); 
}

现在运行该软件,在文本框中输入一个消息,点击send按钮,在第二个打开的界面即可显示之前输入的消息。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值