Respond to the Send Button
如果希望响应按钮的点击事件,需要编辑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的一个方法名,供系统在响应按钮点击的调用。
下面我们要进入真正的JAVA编程环节了^0^
在src这个目录下,com.example.myfirstapp里有一个名为MainActivity.java的文件,这就是我们的主程序了。双击打开它:
package com.example.myfirstapp; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }作为入门的第一个程序,这段代码还是比较简短的。这里,我们暂时不对它进行分析。继续延着官方教程前进^0^
在前面我们已经知道了,sendMessage是作为我们activity的一个方法名存在的,因此我们要在MainActivity这个类中去实现sendMessage这个方法,即添加下面的代码:
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
这段代码实际内容很少,但是我们仍然需要解释一番才行,以便于理解。
首先,如果你在编辑器里添加了这段代码,Eclipse马上就会显示一个错误,在View下会用红色波浪线标注它不能识别,如下图显示:
解决的途径也很简单,那就是在代码的前面增加一条import语句,就像这样:
import android.view.View;你可以手工添加上面的语句,也可以使用快捷键(Ctrl + Shift + O)来引入那些缺失的类。
要确保系统可以调用这个方法,必须保证方法名与android:onClick属性里设置的一样,同时还需要确保:
(1)这个方法必须是public的;
(2)这个方法的返回值设置为void;
(3)这个方法有且仅有一个参数,那就是View(它就是那个被点击的View,换句话说,它就是那个按钮)。
接下来,我们要做的事情就是填充这个方法,以实现读取那个文件域(text field)的内容并传递给另外一个activity。
Build an Intent
Intent是一种提供两个独立组件之间运行时绑定功能的对象,例如两个activities之间。Intent代表着一个应用程序“意图去做某一件事情”。你可以使用intent去完成各种各样的任务,但是通常他们被用作启动另外一个activity。
在我们的sendMessage()方法中,创建一个Intent,并用它去启动一个名叫DisplayMessageActivity的activity。实现代码如下:
Intent intent = new Intent(this, DisplayMessageActivity.class);
这里使用的构造函数带有两个参数:
(1)第一个参数是一个Context,这里使用的是this,即指的是当前这个Activity,Activity是Context的子类。
(2)第二个参数是程序组件的类,即系统将要传递Intent的那个类,在这种情况下就是指被启动的activity。
注意,当前代码中对DisplayMessageActivity的引用会导致Eclipse的一个错误,因为这个类目前还不存在。暂时可以先忽略这个错误,因为后面我们马上就要创建这个类。
Intent不仅可以用来启动另外一个activity,而且它还能传递数据给这个activity。在sendMessage()方法中,可以使用findViewById()来获得界面中的那个文本编辑组件,并且将它的文本信息添加到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可以承载一系列数据(键-值的形式),并称之为extras。putExtra()方法的第一个参数为键名,第二个参数为键值。
为了使下一个activity可以检索到那些附加的数据,你需要为你的intent的extra定义一个键(使用一个常量)。为此,将EXTRA_MESSAGE的定义放在MainActivity类的最前面,就像这样:
public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; ... }
一般比较好的做法是,在定义intent extra的键值时,使用你的应用程序的包名来做为前缀。这样可以确保你的应用程序在与其他应用程序交互时,它们是唯一的。
Start the Second 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这个类,好让上面的代码得以正常运行。
在Eclipse中,点击左上角菜单栏下面的New图标。在弹出的窗口中选择Android下面的Android Activity,然后点击Next按钮。
在下一个界面中选择BlankActivity,然后点击Next按钮继续。
接下来要为这个Activity配置一些参数,然后点击Finish按钮。
如果使用的不是Eclipse或者使用的是命令行工具,那么就在src/目录下创建一个名为DisplayMessageActivity.java的源代码文件。
下面我们打开DisplayMessageActivity.java这个文件,看看Eclipse创建的这个activity长得什么样:
package com.example.myfirstapp; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.support.v4.app.NavUtils; public class DisplayMessageActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_message); // Show the Up button in the action bar. getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_display_message, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // This ID represents the Home or Up button. In the case of this // activity, the Up button is shown. Use NavUtils to allow users // to navigate up one level in the application structure. For // more details, see the Navigation pattern on Android Design: // // http://developer.android.com/design/patterns/navigation.html#up-vs-back // NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } }
如果不是使用Eclipse创建的DisplayMessageActivity类,那么就照着上面的代码修改。
所有Activity的子类都必须实现onCreate() 方法。系统在创建一个activity实例时需要调用它。在这个方法中,你必须调用setContentView()方法来定义activity的布局,同时为相关activity组件进行初始化设置。
需要注意的是,如果你不是使用Eclipse,那么很可能缺少setContentView()方法需要使用的activity_display_message布局。但是,你不必为此而担心,因为我们将在后面修改这个方法而不再使用这个布局。
Add the title string
如果你使用的是Eclipse,那么下面的步骤可以省略,因为模板已经为新activity提供了标题这个字符串资源。
如果你不是使用Eclipse,则需要手工在strings.xml文件中为这个新activity添加一个字符串资源,就像下面这样:
<resources> ... <string name="title_activity_display_message">My Message</string> </resources>
Add it to the manifest
所有的activity都必须在manifest文件(AndroidManifest.xml)中使用<activity>元素进行定义。
同样,如果使用的是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的父亲是谁。系统使用这个值,以实现缺省的回退行为(Android4.1-API level 16以上)。你可以通过使用Support Library和<meta-data>元素来实现同样的行为,在老的Android版本上。
注意:你的开发环境Android SDK必须已经包含最新的Android Support Library。它已经包含在ADT中了。如果你使用的不是ADT,则需要自己手工安装。如果是使用Eclipse中的模板进行开发,Support Library就已经自动包含在你的工程中了。你可以在工程目录下Android Dependencies中看到。如果不是使用Eclipse,你就需要手工添加到你的工程中。
如果使用的是Eclipse进行开发,现在你可以运行一下程序了,不过没有新的变化发生。当点击Send button按钮时将会启动一个新的activity,它使用的是模板自动创建的“Hello world”缺省布局。我们马上就要修改它,让它显示一个客户信息。
Receive the Intent
每一个Activity都由Intent触发,不管用户如果定位到那里。你可以通过调用getIntent()方法获得那个启动你的activity的Intent,并接收它所包含的数据。
在DisplayMessageActivity类的onCreate()方法中,获取intent并提取其中由MainActivity传送的消息。
Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
Display the Message
为了在屏幕上显示这个文本信息,需要创建一个TextView部件,并且使用setText()方法设置它的信息。还需要使用setContentView()方法把这个TextView设置成activity的root 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按钮,这些信息就会显示在下一个界面中。
这就是你创建的第一个Android程序了。
想学习更多的建立Android应用程序的知道,在接下来练习课程中继续。下一课是Managing the Activity Lifecycle。