csol怎么让僵尸变色:设计Android的用户界面(四) -1

来源:百度文库 编辑:中财网 时间:2024/05/04 22:13:09

设计Android的用户界面(四) -1

前面的文章已经讲到了如何在一个Activity中与用户进行交互。这篇文章将解释如何创建多个Activity的用户界面,以及了解Activity的生命周期。这次是一个完整的示例,可以在这里下载源代码。

这个多Activity的示例程序的功能大概是这样的:

  1. 在主页面上有三个元素:一个文本输入框,两个按钮。用户可以在文本框中输入一些字符
  2. 点击第一个按钮,将弹出一个对话框形式的Activity,显示”Hello, …”
  3. 如果点击的是第二个按钮,将显示另一个全屏的Activity,显示”Hello, …”

OK,按照前面的规矩,分成几步:

第1步,先完成UI的设计,创建布局。

从程序来看,似乎有三个Activity,但是第二个和第三个几乎是相同的,于是,只创建两个布局:
res/layout/main.xml

res/layout/dialog.xml

第2步,然后呢,需要把上面提到的字符变量声明一下:
res/values/strings.xml

Hello, Say Hello(Dialog)Say Hello(Activity)Activity Lifecycle

通过前面的文章,上面的东西应该都比较好懂。

第3步,创建Activity,这里和第一步一样,虽然有三个Activity,但是看起来用两个其实就够了。然而事实并非如此,具体原因后续,我们需要定义三个Activity:分别将他们定义为:ActivityLifecycle(用来显示主画面)、AlertDialog(用来显示对话框)和AlertActivity(用来显示那个全屏的Activity)。

主Activity:

package com.roiding.sample;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class ActivityLifecycle extends Activity {private static final String TAG = "ActivityLifecycle";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i(TAG, "onCreate ...");setContentView(R.layout.main);final EditText editText = (EditText) findViewById(R.id.edittext_input);// try to display a dialogButton btn_dialog = (Button) findViewById(R.id.button_sayhello_dialog);btn_dialog.setOnClickListener(new OnClickListener() {public void onClick(View v) {Intent intent = new Intent();intent.putExtra("name", editText.getText().toString());intent.setClass(ActivityLifecycle.this, AlertDialog.class);startActivity(intent);}});// try to display a activityButton btn_activity = (Button) findViewById(R.id.button_sayhello_activity);btn_activity.setOnClickListener(new OnClickListener() {public void onClick(View v) {Intent intent = new Intent();intent.putExtra("name", editText.getText().toString());intent.setAction("com.roiding.sample.action.MAIN");startActivity(intent);}});}@Overridepublic void onStart() {super.onStart();Log.i(TAG, "onStart ...");}@Overridepublic void onResume() {super.onResume();Log.i(TAG, "onResume ...");}@Overridepublic void onPause() {super.onPause();Log.i(TAG, "onPause ...");}@Overridepublic void onStop() {super.onStop();Log.i(TAG, "onStop ...");}@Overridepublic void onDestroy() {super.onDestroy();Log.i(TAG, "onDestroy ...");}@Overridepublic void onRestart() {super.onDestroy();Log.i(TAG, "onRestart ...");}}

在这里面:
以下语句,前文都提到过:

  • final EditText editText = (EditText) findViewById(R.id.edittext_input)
  • btn_dialog.setOnClickListener(new OnClickListener())

主要说一下这些:

  • Log.i(TAG, “onStart …”);
    这是Android中日志的处理方式,用法于Log4j类似,但是要比Log4j简单的多,因为用的几乎都是static的方法。分别是Log.v 、 Log.d 、 log.i、 log.w、 log.e。使用Log打印的日志通过LogCat可以看到。方法中的第一个属性一般用来标识一下日志是谁打印出来的,便于查找。
  • Intent intent = new Intent();
    对UI来说,这里面的Intent是一个非常重要的概念(几个重要的概念了?)。并且要理解它会比理解View、Activity什么的要困难一些,这部 分会在单独的一篇文章中讨论。在这里,只需要知道:通过它,可以找到下一个要显示的Activity,并为这个Activity携带了一些数据。也就是说 它有两个重要的使命:定位下一个Activity;并捎带一些数据。所以在Android的文档中,称Intent为Activity之间的双面胶。更详 细的解释留待后面的某篇文章中吧。
  • startActivity(intent);
    通过startActivity(intent)可以启动并显示另外一个Activity。

第2个Activity

package com.roiding.sample;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;public class AlertDialog extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.dialog);Intent intent = getIntent();String name = (String) intent.getExtras().get("name");TextView textview = (TextView) findViewById(R.id.textview_hello);if (name != null) {String hello = getResources().getString(R.string.hello);textview.setText(hello + name);}}}

在这个Activity里面,只有一个语句需要解释一下:

  • String name = (String) intent.getExtras().get(”name”);
    用来获得前面Activity捎带过来的数据

第3个Activity和第2个几乎完全一样:

package com.roiding.sample;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;public class AlertActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.dialog);Intent intent = getIntent();String name = (String) intent.getExtras().get("name");TextView textview = (TextView) findViewById(R.id.textview_hello);if (name != null) {String hello = getResources().getString(R.string.hello);textview.setText(hello + name);}}}

到这一步,所有的事情似乎都已经完成了,可以运行了,如果在这时你等不及而去运行程序,将会得到一些ActivityNotFoundException 之类的异常。这里还需要一步,如果以前写的程序都是单Activity的,那么Eclipse的Android插件会自动完成这一步,如果是多 Activity的,或者需要对Activity作更仔细的控制,那么就要这一步了。

第4步,编辑AndroidManifest.xml
这个文件像一个户口簿一样记录每一个Activity的信息,Android系统会通过这个文件得到:执行这个程序的时候,启动的是那个Activity 等信息。不仅如此,这个还包括Intent、Provider等其他一些信息。如果你用过一些Web MVC框架的话,这个文件的功能就像是那个MVC的配置文件。

注意这里面的第二个和第三个Activity声明方式不一样,这个留待讲述Intent的时候再讲。
好了,我们可以运行这个程序了。

看起来篇幅似乎过长了,那么关于Activity的生命周期放在下一篇文章中。