我们现在记得我们曾想让我们的 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提供