本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:210
评论数量:205
留言数量:-19
访问次数:919740
建立时间:2007年5月10日




[Android]Android学习笔记(2)-初识Activity
文章收藏,  网上资源,  软件技术,  电脑与网络

李小白 发表于 2008/10/30 18:13:50

载录自颜承ID:sharetop http://blog.csdn.net/sharetop/archive/2007/12/14/1936478.aspx   根据文档的解释,Activity是Android开发中非常重要的一个基础类。我把它想像成J2ME中的Display类,或者是Win32平台上的Form类,也许不准确,但是它的重要性我觉得应该是一样的(当然,如果我们写的是一个没有界面的应用,例如后台运行的服务之类的,可以不用Display的)。1.在一个Activity中使用多个View如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。首先,我们增加一个新的资源描述layout/second.xml。 500)this.width=500'><?xml version="1.0" encoding="utf-8"?>500)this.width=500'><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"500)this.width=500'>    android:orientation="vertical"500)this.width=500'>    android:layout_width="fill_parent"500)this.width=500'>    android:layout_height="fill_parent"500)this.width=500'>    >500)this.width=500'><TextView id="@+id/txt"  500)this.width=500'>    android:layout_width="fill_parent" 500)this.width=500'>    android:layout_height="wrap_content" 500)this.width=500'>    android:text="Hello 中国"500)this.width=500'>    />500)this.width=500'> <Button id="@+id/go2"500)this.width=500'>        android:layout_width="wrap_content" android:layout_height="wrap_content" 500)this.width=500'>        android:text="back">500)this.width=500'>        <requestFocus />500)this.width=500'>    </Button>   500)this.width=500'></LinearLayout> 除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器。 500)this.width=500'>  public void setViewOneCommand()500)this.width=500'>500)this.width=500'>    ...{500)this.width=500'>        Button btn = (Button)findViewById(R.id.go);500)this.width=500'>        btn.setOnClickListener(new View.OnClickListener()500)this.width=500'>500)this.width=500'>        ...{500)this.width=500'>            public void onClick(View v)500)this.width=500'>500)this.width=500'>            ...{500)this.width=500'>                helloTwo.this.setContentView(R.layout.second);500)this.width=500'>                helloTwo.this.setViewTwoCommand();                500)this.width=500'>            }500)this.width=500'>        });       500)this.width=500'>        Button btnExit=(Button)findViewById(R.id.exit);500)this.width=500'>500)this.width=500'>        btnExit.setOnClickListener(new View.OnClickListener()...{500)this.width=500'>500)this.width=500'>            public void onClick(View v)...{500)this.width=500'>                helloTwo.this.finish();500)this.width=500'>            }500)this.width=500'>        });    500)this.width=500'>    }500)this.width=500'>    public void setViewTwoCommand()500)this.width=500'>500)this.width=500'>    ...{500)this.width=500'>        Button btnBack=(Button)findViewById(R.id.go2);500)this.width=500'>500)this.width=500'>        btnBack.setOnClickListener(new View.OnClickListener()...{500)this.width=500'>500)this.width=500'>            public void onClick(View v)...{500)this.width=500'>                helloTwo.this.setContentView(R.layout.main);500)this.width=500'>                helloTwo.this.setViewOneCommand();500)this.width=500'>            }500)this.width=500'>                                        500)this.width=500'>        });500)this.width=500'>    } 最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。新的onCreate方法如下: 500)this.width=500'>500)this.width=500'>    public void onCreate(Bundle icicle) ...{500)this.width=500'>        super.onCreate(icicle);500)this.width=500'>        setTheme(android.R.style.Theme_Dark);500)this.width=500'>        setContentView(R.layout.main);    500)this.width=500'>        setViewOneCommand();        500)this.width=500'>    } 编译,运行,OK。2.还是回到正道上,多个Activity之间的跳转Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。先在应用中增加两个Activity,这需要修改AndroidManifest.xml文件了,如下: 500)this.width=500'><?xml version="1.0" encoding="utf-8"?>500)this.width=500'><manifest xmlns:android="http://schemas.android.com/apk/res/android"500)this.width=500'>    package="cn.sharetop.android.hello.three">500)this.width=500'>    <application android:icon="@drawable/icon">500)this.width=500'>        <activity class=".HelloThree" android:label="@string/app_name">500)this.width=500'>            <intent-filter>500)this.width=500'>                <action android:value="android.intent.action.MAIN" />500)this.width=500'>                <category android:value="android.intent.category.LAUNCHER" />500)this.width=500'>            </intent-filter>500)this.width=500'>        </activity>500)this.width=500'>        <activity class=".HelloThreeB" android:label="@string/app_name">500)this.width=500'>        </activity>500)this.width=500'>    </application>500)this.width=500'></manifest>  很简单,就是加一个<Activity>标签而已,新标签的class是.HelloThreeB,显示的应用标题与前一个Activity一样而已,然后第二步就是修改一个HelloThree类的实现,在onCreate方法中绑定按钮的事件处理器: 500)this.width=500'>500)this.width=500'>    public void onCreate(Bundle icicle) ...{500)this.width=500'>        super.onCreate(icicle);500)this.width=500'>        setTheme(android.R.style.Theme_Dark);500)this.width=500'>        setContentView(R.layout.main);500)this.width=500'>        setViewOneCommand();500)this.width=500'>    }500)this.width=500'>    public void setViewOneCommand()500)this.width=500'>500)this.width=500'>    ...{500)this.width=500'>        Button btn = (Button)findViewById(R.id.go);500)this.width=500'>        btn.setOnClickListener(new View.OnClickListener()500)this.width=500'>500)this.width=500'>        ...{500)this.width=500'>            public void onClick(View v)500)this.width=500'>500)this.width=500'>            ...{500)this.width=500'>                Intent intent = new Intent();500)this.width=500'>                intent.setClass(HelloThree.this, HelloThreeB.class);500)this.width=500'>                startActivity(intent);500)this.width=500'>                finish();            500)this.width=500'>            }500)this.width=500'>        });       500)this.width=500'>        Button btnExit=(Button)findViewById(R.id.exit);500)this.width=500'>500)this.width=500'>        btnExit.setOnClickListener(new View.OnClickListener()...{500)this.width=500'>500)this.width=500'>            public void onClick(View v)...{500)this.width=500'>                HelloThree.this.finish();500)this.width=500'>            }500)this.width=500'>        });    500)this.width=500'>    }  这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。3.如果我想在两个Activity之间进行数据交换,怎么办?前例中的startActivity()只有一个参数,如果需要向新打开的Activity传递参数,我们得换一个函数了, Android提供了startSubActivity(Intent,int)这个函数来实现这个功能。函数原型为: public void startSubActivity(Intent intent, int requestCode)这里的requestCode用来标识某一个调用,一般由我们定义一个常量。如何把参数传过去呢?Intent类在提供setClass()函数的同时也提供了一个setData()函数。函数原型为:public Intent setData(ContentURI data)参数类型是ContentURI,它的详细内容下回再分析,现在就把它当成一个String类型来用吧。参数带到新的Activity后,同样用Activity.getIntent()函数可以得到当前过来的Intent对象,然后用getData()就取到参数了。把参数带回来的方法是Activity.setResult(),它有几个形式,现在先看最简单的一个吧。函数原型是:public final void setResult(int resultCode, String data)resultCode是返回代码,同样用来标识一个返回类型,而data则是它要返回的参数。在原来的Activity中的事件处理回调函数onActivityResult,会被系统调用,从它的参数里可以得到返回值。函数原型为:protected void onActivityResult(int requestCode, int resultCode,String data, Bundle extras)这里的requestCode就是前面启动新Activity时的带过去的requestCode,而resultCode则关联上了setResult中的resultCode,data是参数,extras也是一个很重要的东西,后面再研究一下它的作用。下面,我们来看一下代码吧,先看看HelloThree中的代码: 500)this.width=500'>    public void setViewOneCommand()500)this.width=500'>500)this.width=500'>    ...{500)this.width=500'>        Button btn = (Button)findViewById(R.id.go);500)this.width=500'>        btn.setOnClickListener(new View.OnClickListener()500)this.width=500'>500)this.width=500'>        ...{500)this.width=500'>            public void onClick(View v)500)this.width=500'>500)this.width=500'>            ...{500)this.width=500'>                try500)this.width=500'>500)this.width=500'>                ...{                    500)this.width=500'>                    Intent intent = new Intent();500)this.width=500'>                    intent.setClass(HelloThree.this, HelloThreeB.class);500)this.width=500'>                    intent.setData(new ContentURI("One"));                    500)this.width=500'>                    startSubActivity(intent,REQUEST_TYPE_A);500)this.width=500'>                }500)this.width=500'>500)this.width=500'>                catch(Exception ex)...{}500)this.width=500'>            }500)this.width=500'>        });       500)this.width=500'>        Button btnExit=(Button)findViewById(R.id.exit);500)this.width=500'>500)this.width=500'>        btnExit.setOnClickListener(new View.OnClickListener()...{500)this.width=500'>500)this.width=500'>            public void onClick(View v)...{500)this.width=500'>                HelloThree.this.finish();500)this.width=500'>            }500)this.width=500'>        });    500)this.width=500'>    } 500)this.width=500'>    protected void onActivityResult(int requestCode, int resultCode,500)this.width=500'>            String data, Bundle extras)500)this.width=500'>500)this.width=500'>    ...{500)this.width=500'>500)this.width=500'>        if (requestCode == REQUEST_TYPE_A) ...{500)this.width=500'>500)this.width=500'>            if (resultCode == RESULT_OK) ...{500)this.width=500'>                Log.v(TAG,data);500)this.width=500'>                TextView txt = (TextView)findViewById(R.id.txt);500)this.width=500'>                txt.setText(data);                500)this.width=500'>            }500)this.width=500'>        }500)this.width=500'>    } 这里的REQUEST_TYPE_A是我们定义的一个常量。在onActivityResult中用它与RESULT_OK一起作为条件判断如何处理返回值,这里只是简单将TextView显示值换成传来的字串。再来看看另一个HelloThreeB类的实现代码: 500)this.width=500'>    private Intent i;500)this.width=500'>500)this.width=500'>    protected void onCreate(Bundle icicle) ...{500)this.width=500'>        super.onCreate(icicle);500)this.width=500'>        setContentView(R.layout.second);    500)this.width=500'>        500)this.width=500'>        i = getIntent();500)this.width=500'>        500)this.width=500'>        android.util.Log.v(TAG,"onCreate");500)this.width=500'>        Button btn = (Button)findViewById(R.id.go);500)this.width=500'>500)this.width=500'>        btn.setOnClickListener(new View.OnClickListener()...{500)this.width=500'>500)this.width=500'>            public void onClick(View v)...{500)this.width=500'>                String result=HelloThreeB.this.i.getData().toString()+" And Two";500)this.width=500'>                HelloThreeB.this.setResult(RESULT_OK,result);500)this.width=500'>                finish();500)this.width=500'>            }            500)this.width=500'>        });500)this.width=500'>        500)this.width=500'>        TextView v = (TextView)findViewById(R.id.txt);500)this.width=500'>        v.setText("Param is "+i.getData().toString());500)this.width=500'>        500)this.width=500'>    } 在按钮处理事件中,从Intent取出参数,处理一下再用setResult返回给前一个Activity即可。编译运行即可。今天先到这里,下一回我再研究一下Activity的生命周期的问题。


阅读全文(3458) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.324 second(s), page refreshed 144783609 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号