启动另一个Activityjava
在完成了上一节课的学习后,咱们已经建立了一个带有text输入框和一个button的app。android
在本课中,咱们将在MainActivity类中添加SendButton的单击响应代码以启动另一个Activity。app
响应Send Button编辑器
为了响应Send Button的单击事件,咱们打开Activity_main.xml布局文件,ide
而且为<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",是MainActivity的一个方法名,而且当用户工具
单击Send Button的时候会调用该方法。布局
打开类MainActivity(在项目src目录下),而后在该类中添加Send Button的响应方法:sendMessage。学习
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
若是使用的是Eclipse等相似的编辑器的话,在参数View的地方会提示错误的,为了避免出现错误,须要先导入View类。ui
import android.view.View;
小提示:在Eclipse下可使用快捷键Ctrl+Shift+O组合键自动导入须要导入的类。(Mac系统下快捷组合键是:Cmd+Shift+O)
为了系统可以将该方法和android:onClick事件绑定到一块儿,该方法须要设置以下标志位(修饰符?):
1.该方法须要为Public类型
2.返回值类型须要为void
3.View做为惟一的参数(标识哪一个view的单击事件)
创建一个Intent
Intent是一个对象,它可以将两个分离的组件(好比两个Activities)进行运行时绑定。
Intent能够理解为当前app “想要作什么”。你能够为多任务使用Intent,可是大多数状况下
咱们经常是用Intent来启动另一个Activity。
如今咱们在sendMessage()方法内建立一个Intent来启动另一个叫DisplayMessageActivity的Activity。
Intent intent = new Intent(this, DisplayMessageActivity.class);
Intent函数初始化构造函数须要两个参数:
1.第一个参数是一个设备上下文Context(这里使用this的缘由是由于Activity类是Context类的子类)
2.第二个参数是Intent须要启动的Activity。
注意:当咱们在Eclipse以及其相似的IDE下编写此代码时,使用DisplayMessageActivity时会触发一个错误。
如今先忽略这个错误提示,由于咱们尚未建立Activity DisplayMessageActivity,咱们会在稍后建立它。
建立的Intent不只仅可以启动一个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能够附加各类数据类型的集合使用STL中咱们熟知的键-值的方式,咱们称它为额外的(extras)。
附加方法就是使用putExtra()方法,它的第一个参数就是键值,第二个参数就是该键对应的值。
为了指定的Activity可以获取Intent附加的值,咱们须要使用一个public类型的常量来做为附加值的键值。
因此咱们定义在MainActivity类的顶部建立EXTRA_MESSAGE常量:
public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; ... }
为了区分不一样的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 Activity,而后单击下一步。
3.选择BlankActivity,而后单击下一步。
4.填写新类的具体参数:
11. Project: MyFirstApp ->也就是咱们当前的app
22. Activity Name: DisplayMessageActivity ->也就是咱们将要建立的类的名称
33. Layout Name: activity_display_message -> 布局xml文件名称
44. Title: My Message -> 新Activity标题名称
55. Navigation Type: none
5.点击完成按钮。
若是你使用的不是Eclipse或者是命令行工具,在项目src目录下于MainActivity.java文件相邻位置建立一个DisplayMessageActivity.java文件。
若是使用的是Eclipse建立的Activity,那么咱们打开DisplayMessagActivity.java文件。
1.新建的类已经帮咱们建立好了onCreate()方法。
2.还有一个建立好的哦你CreateOption是Menu()方法,不过这个例子不须要它,因此能够删除掉。
3.还有一个建立好的哦你Option是ItemSelected()方法,这个方法用来处理单击ActionBar上的上一步操做按钮的点击事件。保留该方法。
由于ActionBar的API只在HONEYCOMB(API level 11)以及其之后的版本才能使用。因此咱们必须在使用getActionBar()方法前进行条件判断
以判断当前的平台是否支持此API。另外咱们必须在onCreate()方法内使用@SuppressLint("NewApi")标签来避免lint错误。(注:新版本的Android SDK
已经不须要这令不处理了,它本身建立好了一个setupActionBar()方法来进行检查操做。)
如今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的集成开发环境,使用上面的代码更新你的DisplayMessageActivity类。
全部Activity的子类都必须重载onCreate()方法。当建立该类的实例的时候,系统会调用该函数。
在这个函数内部你必须使用setContentView()方法来定义Activity的布局。
注意:若是你使用的不是Eclipse,你的setContentView()所须要的activity_display_message布局文件
并无自动建立,不用担忧,稍后在咱们使用到该布局的时候就会添加它。
添加标题字符串
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
添加新类到mainfest文件
全部的Activities都须要在mainfest文件中进行声明,可使用<activity>元素(标签)进行声明。
同理Eclipse会自动为咱们建立该元素,因此若是你使用的不是Eclipse,那么就须要在mainfest文件中添加
以下内容:
<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属性标识了该类的父类的类名称。系统使用此值去实现默认的操做。
好比安卓4.1以及其之后版本的后退操做。咱们也可使用这种行为在老版本中经过SupportLibrary
以及添加<meta-data>元素。
若是使用的是Eclipse那么咱们就能够运行这个APP了,可是不会实现什么大功能,当咱们点击这个按钮的
时候,只是显示"Hello world",而这个字符串就是咱们第一课所看到由模板自动生成的。
接收Intent
每个被Intent调用的Activity,不管用户是如何操做抵达这一步的,咱们均可以经过调用getIntent()方法
来获得Intent以及其中附加的数据包。
下面来看一下在DisplayMessageAcitvity类的onCrate()方法中来获得intent而且获取MainActivity中附加的数据包。
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示附加的数据包
为了显示数据到屏幕上,咱们将建立一个TextView窗口而且使用setText()方法将获取到的数据包赋予此Textview。
而后使用setContentView()方法将此TextView设置到DisplayMessageAcitvity的显示视窗中。
DisplayMessageAcitvity完整的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了,咱们输入一些字符串在MainActivity的EditText中,而后单击send button,
那么咱们输入的字符串就会在intent调用的DisplayMessageAcitvity中显示出来了。
若是你使用的Eclipse,你能够跳过下一段落,由于Eclipse的模板已经提供了新建类的标题字符串
若是你使用的不是Eclipse,添加标题字符串在strings.xml文件中: