启动另一个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:
- 点击工具栏中的新建。
- 在弹出的窗口中选择Android文件夹然后选择Android Actitivy,点击下一步。
- 选择BlankActivity,点击下一步。
- 填满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的启动逻辑。个人整理的东西,可能存在很多瑕疵,如有瑕疵,不是巧合。
例如,你可以通过Intent启动另一个Activity或Service。此外,Intent还可以跨应用使用,这意味着你可以启动其他应用程序中的组件,如地图应用中的Activity来显示地址信息。这种机制为单个应用提供了多个入口点,并...
应用应该有一个直观的界面,让用户轻松启动和关闭划词翻译模式,查看翻译结果,并能够保存和分享翻译内容。Material Design指南可以作为UI设计的参考,确保应用符合现代Android应用的设计规范。 为了保证应用的稳定...
例如,一个短信应用可能包含多个Activity:一个用于显示联系人列表,一个用于撰写短信,还有一个用于查看历史记录或更改设置。 - **Service**:Service是在后台执行长时间运行操作(如播放音乐或上传文件到服务器)...
一个短信应用可能拥有多个Activity,比如一个用于编写新消息,另一个用于查看已发送的消息列表。 2. **Service**:服务(Service)是在后台长时间运行的组件,它不提供用户界面。典型的例子包括播放音乐的服务或者...
Intent 可以用来启动另一个 Activity、启动 Service 或发送广播。它们可以携带数据,允许组件之间传递信息。 Android 资源和布局(Resources & Layouts):Android 应用通常包含多种资源文件,如字符串、图像、颜色...
在这个项目中,需要创建一个Activity来管理翻译界面。Intent用于在不同组件之间传递数据和启动服务。 4. **翻译API集成**:为了实现翻译功能,需要接入第三方翻译API,如Google Translate API或有道翻译API。这涉及...
通过`setOnClickPendingIntent()`方法,我们可以为小部件的特定组件设置点击监听,当用户点击时,对应的PendingIntent会被触发,从而执行相应操作,比如启动服务、跳转到另一个Activity等。 在应用中,通常还需要一...
4. **Activity与Intent**:Activity是Android应用的基本组件,代表用户界面的一个屏幕。Intent则是连接不同Activity的桥梁,用于启动新的Activity或者传递数据。 5. **布局与视图**:XML用于定义应用的用户界面,...
例如,如果应用程序需要启动另一个应用程序的活动,那么可以发送一个 Intent 请求,系统将根据 Intent 的内容来确定需要启动哪个活动。 Android 应用程序的安全机制包括数字签名和权限机制。数字签名用于确保应用...
Intent是一种消息对象,可以用来启动另一个组件或者传递数据。 #### 2.1 激活组件:Intent Intent主要有两种类型:显式Intent和隐式Intent。显式Intent直接指定要启动的组件,而隐式Intent则通过Intent过滤器匹配...
这个合集主要涵盖了Android开发中的多个重要知识点,由Android中文翻译组精心编译和翻译,旨在为国内开发者提供更易理解和使用的中文资源。以下是对其中一些关键概念和技术的详细解读: 1. **Android系统架构**:...
一个应用可能包含多个Activity,它们通过启动一个Activity来切换界面。每个Activity都是Activity基类的子类,有自己的窗口,并使用视图对象(Views)来构建界面。视图是用户与界面交互的元素,如按钮、文本框等。...
一个应用可能包含一个或多个Activity,它们协同工作以构建用户界面。每个Activity都是Activity基类的子类,可以有默认窗口或自定义窗口。Activity之间通过启动新Activity来实现跳转。每个Activity都包含视图对象,...
4. **Intent**:Intent是Android系统中的一种消息传递机制,用于启动另一个Activity或Service。比如,我们可以通过Intent启动一个新的Activity,传递数据。 5. **权限请求**:如果应用需要访问如网络、摄像头等敏感...
【安卓课设:翻译君APP.zip】是一个针对安卓平台的课程设计项目,旨在开发一个名为“翻译君”的应用程序。这个项目可能涵盖了多个Android应用开发的关键知识点,包括但不限于以下几个方面: 1. **Android Studio...
例如,可能存在一个主屏幕Activity用于搜索词汇,另一个Activity用于展示详细的单词解释。在AndroidManifest.xml文件中,这些Activity会被声明并配置。 接着,数据存储是电子词典的关键部分。词典数据可能存储在...
在这个词典应用中,可能有一个主Activity负责显示词典界面,用户点击按钮后,通过Intent来启动另一个Activity实现翻译功能。 4. **数据存储**:应用使用了外部数据库,这可能是SQLite数据库。SQLite是Android系统...