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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_display_message);// Show the Up button in the action bar.getActionBar().setDisplayHomeAsUpEnabled(true);}@Overridepublic 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;}@Overridepublic 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);}}
  • 这个类已经包含了onCreate()方法的实现。
  • 还有一个onCreateOptionsMenu()方法的实现,但当前这个应用并不需要,所以可以删除它。
  • 还有一个onOptionsItemSelected()方法的实现,它是处理上一步行为的,让它保持原样吧。

如果不是使用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()方法代码如下所示:

@Overridepublic 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。

更多相关文章

  1. 本来想用“{{”秀一波,结果却导致了内存溢出!
  2. pgsql查看主备节点的方法
  3. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  4. android和linux开源社区的分裂
  5. 实现基于Android的英文电子词典
  6. NDK开发 环境搭建 与 JNI的编写
  7. WebView 使用Android(安卓)原生ToolBar
  8. Android学习笔记之GridView
  9. Android原理揭秘系列之View、ViewGroup

随机推荐

  1. Google 联合 MIT 开源 Android(安卓)App
  2. [Android] 内存泄漏调试经验分享 (二)
  3. Android SQLite 开发教程(1): 概述
  4. Android Studio运行项目闪退(页面闪退以及
  5. 为Android安装BusyBox
  6. Android 中的DisplayMetrics的用法
  7. 编程回忆之Android回忆(有关Android 列表
  8. Android GridView选择样式
  9. 【转】修改Android应用程序的默认最大内
  10. 在Android中实现service动态更新UI界面