• 沒有找到結果。

我们现在记得我们曾想让我们的 Button 按钮可点击。因此我们简单的设置一个 未命名的 OnClick Listener 到我们的 Button 上。

注意:Eclipse 可能不会自己不会认识到以下的导入:

现在我们将添加一个 Intent 到 onClick 事件中。该事件会启动我们的子 Activity:

startSubAct ivity()第二个参数可以是任何唯一整数。他将在后面有用(当我们将替 换它向我们的 Activity 声明为 fina l 时),当我们想要从 SubActivity 中返回一个结 果时。

以上方法已经不用了,在新的 SDK version1.5 中,使用以下方法:

startSubAct ivity()方法已经不用了。要从 SubAct ivity 中返回一个结果,使用以下 两个方法:

b.setOnClickListener(newnewnewnew OnClickListener() {

@Override public

publicpublicpublic voidvoidvoidvoid onClick(View v) {

// TODOTODOTODOTODO Auto-generated method stub

// Place code to handle Button-Click here.

} });

import import import

import android.view.View.OnClickListener;

/* Create an Intent to start *

* MySecond Activity. */

Intent i = new new new

new Intent( StartingSubactivities.thisthisthisthis, MySecond Activity.classclassclassclass);

/* Send intent to the OS to make

* * it aware that we want to start

* * MySecond Activity as a SubActivity. */

startSubActivity(i, 0x1337);

/* Create an Intent to start * MySecond Activity. */

Intent i = newnewnewnew Intent( NextActi vity.thisthisthisthis, MySecond Activity.classclassclassclass);

/* Send intent to the OS to make

* * it aware that we want to start

* * MySecond Activity as a SubActivity. */

startActivity(i);

startActivityForResult(intent, requestCode);

startActivityFromChild(child, intent, requestCode);

anddev.org提供

51 51 51 51

如果我们现在就运行我们的代码并且点击我们的按钮,我们将会收到以下错误信 息:

图 20 Activity 没有在 Android Manifest.xml 中定义

注意:显示的信息中一些十分有用,阅读它们。

我们也需要在 Android Manifest.xml 文件中定义我们的"M ySecondActivity". 只要 在第一个</activity>标签后面编写:

这时我们不为<action> 选择"MAIN", 并且也不为<category>选择"LAUNCHER",

因为不需要让"M ySecondActivity"从我们应用程序外部运行。

现在"M ySecondActivity"可以通过点击该按钮来达到了。但是他也引用到我们的 mia n.xml:

<activity

android:name=".MySecond Activ ity"

android:label="@string /app_name">

<intent-filter>

<action android:name="and roid.intent.action.V IEW" />

<category

android:name="and roid.intent.categor y.DEFAULT" />

</intent-filter>

</activity>

setContentView(R.layout.main);

anddev.org提供

52 52 52 52

因此我们不得不为"M ySecondActivity"创建一个额外的 Layout.该 Layout 经包含 一个叫做 EditText 的(在 Swing 术语中叫做 TextField)和其他返回到我们"主"-Activity 的 Button:

当然,两个都需要一个我们在 Java 代码中使用到的 android:id 。现在我们可以修 改"M ySecondActivity"的 setContentView 成:

<EditText

android:id="@+id /et_keyword"

android:layout_width="fill_parent"

android:layout_height="wrap_content" />

<Button

android:id="@+id /btn_return"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Sub mit" />

package package package

package zyf.myTest;

import import import

import android.app.Acti vity;

import import import

import android.content.Intent ; import

import import

import android.os.Bundle;

import import import

import android.view.View;

import import import

import android.view.View.OnClickListener;

import import import

import android.widget.Button;

public public public

public classclassclassclass StartingSubactivities extendsextendsextendsextends Activity implements

implements implements

implements OnClickListener { private

privateprivateprivate Button open; private

privateprivateprivate Intent toIntent;

@Override public

publicpublicpublic voidvoidvoidvoid onCreate(Bundle savedInstanceState) { super

super super

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

open=(Button)find ViewById(R.id.btn_open _search);

open.setOnClick Listener(thisthisthisthis);

}

@Override public

publicpublicpublic voidvoidvoidvoid onClick(View v) { ifif

ifif(v.getId()==R.id.btn_open _search){

toIntent = newnewnewnew Intent ();

toIntent.setClass(StartingSubactivities.thisthisthisthis, MySecond Activity.classclassclassclass);

startActivity(toIntent);

} } }

anddev.org提供

53 53 53 53

从 SubActivity SubActivity SubActivity SubActivity 返回值

从 SubActivity 返回数值给调用者也非常简单:(灰色部分)

package package package

package zyf.myTest;

import import import

import android.app.Acti vity;

import import import

import android.content.Intent;

import import import

import android.os.Bundle ; import

import import

import android.view.View;

import import import

import android.view.View.OnClickListener;

import import import

import android.widget.Button;

import import import

import android.widget.EditText;

public public public

public classclassclassclass MySecond Activity extendsextendsextendsextends Activity implements

implements implements

implements OnClickListener { private

private private

private EditText getText; private

private private

private Button back; private

private private

private String getString; private

private private

private Intent backIntent; private

private private

private Bundle backBundle;

@Override protected protected protected

protected voidvoidvoidvoid onCreate( Bundle savedInstanceState) { // TODOTODOTODOTODO Auto-generated method stub

super super super

super.onCreate(savedInstanceState);

setContentView(R.layout.second);

getText=(EditText)findViewById(R.id.et_keyword);

back=(Button)find ViewById(R.id.btn_return);

back.setOnClick Listener(thisthisthisthis);

}

@Override public public public

public voidvoidvoidvoid onClick(View v) {

// TODOTODOTODOTODO Auto-generated method stub if

if if

if(v.getId()==R.id.btn_return){

getString=getText.getText().toString();

backIntent=newnewnewnew Intent();

backBundle=newnewnewnew Bundle();

backBundle.putString("GET_TEXT", getString);

backIntent.putExtras(backBundle);

setResult(RESULT_OK, backIntent);

finish();

} } }

anddev.org提供

54 54 54 54

你可以额外地通过一个叫做 Bundle 的来返回给调用者(或多或少是一个 HashMap) ,但是我马上会告诉你更多它的信息。

明显地调用者不得不响应 SubActivity 指定返回的行为。为了达到那样,我们不 得不重载一个单独的来自于 Activity 类的方法。它叫做 onActivityResult():

你可能认识到第一个参数叫做 requestCode--是的它和我们早期传给

的 requestCode 相同。因此,假如我们有更多的 SubActivity,我们能使用 requestCode 来区分哪一个 SubAct ivity 返回。

贴士:Eclipse 提供一个你将喜爱的非常有用的方法,尤其是如果你正在继承一 个基类时并在寻找重载的方法:

图 21 使用 Eclipse 来找到重载的方法

@Override protected

protectedprotectedprotected voidvoidvoidvoid onActi vityResult(intintintint requestCode, intint

intint resultCode, Intent data) { // TODOTODOTODOTODO Auto-generated method stub

super super super

super.onActivityResult(requestCode, resultCode, data);

if if if

if(requestCode==thisthisthisthis.requestCode){

if

ififif(resultCode==RESULT_CANCELED){

setTitle("Resualt Canceled");

}elseelseelseelse{

String getStringFrom =data.getStringExtra("GET_TEXT");

setTitle(getStringFrom);

} } }

startActivityForResult(toIntent, requestCode);

anddev.org提供

55 55 55 55

因此,我们现在可以简单的选择 requestCode 和创建其他的 Intent 来做 Google 搜 索。

当你这时大概已经认识到这个了,我们将用其他方式创建 Intent。上次我们像这 样说:" 我们想要开启 XYZ .class",但是这次我们描述了我们想要得到。我们想要 查看一个 URI(统一资源定界符),它可以通过使用 Uri.fromParts("……")来 构 造 。

我们的应用程序现在能开启一个(子)Activity,抓取它的返回结果和用一个 Intent 来运行浏览器。

但是如何来传递数据给一个(子)Activity?

switch switch switch

switch (requestCode) { case

case case

case MYSECONDACTIVITY_REQUESTCODE:

/*

* Create a new Intent to

* show the Google -Search Page *

* with the keyword returned.

*/

Intent webIntent = new

newnewnew Intent(Intent.ACTION_VIEW,

Uri.parse("http://www.google.com/search?q =" + getStringFrom ));

startActivity(webIntent);

anddev.org提供

56 56 56 56

相關文件