程序员人生 网站导航

第四章 Android开发三大基石―Activity、Service和Handler(3)

栏目:综合技术时间:2015-01-30 08:36:34

4.1.5Activity交互―Activity跳转

1般的,我们的利用程序都不会简单到只有1个界面,而是会有很多个界面,这个时候我们就会创建多个Activity,然后根据业务逻辑在多个Activity之间进行跳转。

我们可以用切换Layout的方式进行手机页面间的转换。但是如果要转换的页面其实不单单只是背景、色彩或文字内容的不同,而是需要对全部Activity进行置换,并将主控权交给新的Activity,那就不是仅靠改变Layout就可以完成了,我们需要在这些Activity中进行跳转及数据传递。

Activity跳转实现起来也非常简单,可使用Intent来实现利用程序内部的Activity跳转。我们比较经常使用的有两种。1种是单纯的跳转,即跳转完以后就不管跳转前的Activity了,另外一种是跳转到下1个Activity,并等待它的返回结果进行相干的操作。

下面,我们以1个简单的例子来加以说明。

1)1般的跳转

一样的,我们新建1个NextActivity.java类继承自Activity,它的布局文件中只有1个TextView,显示的内容为“This is Activity 2”。

假定我们刚刚创建的MyActivity.java为当前Activity,NextActivity.java为下1个要跳转Activity。我们在main.xml布局文件中,增加1个按钮,点击后实现从MyActivity.java跳转到NextActivity.java的效果,布局文件代码以下:

<?xml version="1.0" encoding="utf⑻"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent" >

<TextView 

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="This is Activity 1"/>

<Button

        android:id="@+id/my_button"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="跳转"/>

</LinearLayout>

 

然后,我们来看看MyActivity中的代码:

private Button btn;

   

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        btn = (Button)findViewById(R.id.my_button);

        btn.setOnClickListener(new View.OnClickListener() {

            

             @Override

             public void onClick(View v) {

                 Intent intent = new Intent();

                 intent.setClass(MyActivity.this, NextActivity.class);

                 startActivity(intent);

             }

        });

    }

 

我们运行1下来看看效果,如图4⑷所示:

图4⑷ Activity跳转前

 

下面,我们点击1下按钮。这个时候,运行出错了,毛病缘由是“android.content.ActivityNotFoundException”,这是由于我们在AndroidManifest.xml文件中没有配置NextActivity,我们简单配置1下:

<activity android:name=".NextActivity" android:label="@string/app_name"/>

 

现在再点击按钮后,效果如图4⑸所示:

图4⑸ Activity跳转后

 

可以看到,跳转已成功了。

--------------------------------------------
试着放个广告 现在没工作 要生存 没办法
平安陆金所 隶属于平安团体的p2p平台
年投资回报率7%-9% 是替换银行理财的首选
个人经验教训 推荐投资安鑫或有担保的彩虹项目
不要投资安e 那个几近没法转让 想提早提现非常困难
注册链接 http://affiliate.lufax.com/action/36XBU
用此链接注册 你我都会有几10元的额外现金嘉奖
--------------------------------------------

2)跳转并返回值

可能很多时候,1般的跳转其实不能满足我们的需求。例如,我们填好1个表单,提交以后出错了,我们回退以后想保存之前已填的数据,这样的话,仅仅只是简单的跳转就不能满足了。

下面,我们来看另外一种跳转方式。在这个例子中,我们要实现从MyActivity跳转到NextActivity,并当MyActivity接收到NextActivity返回来的“信息”时,MyActivity中显示消息,MyActivity中跳转代码以下:

Intent intent = new Intent();
intent.setClass(MyActivity.this, NextActivity.class);

startActivityForResult(intent, 1);

 

这样就从MyActivity跳转到了NextActivity,并传入了1个要求码“1”。同时,我们需要在MyActivity.java中重写Activity中的onActivityResult方法,用于接收NextActivity.java中的返回码,代码以下:

@Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        switch(resultCode){

        case RESULT_OK:

             // 当返回码为RESULT_OK时进行相干操作

        if(requestCode == 1){

                Toast.makeText(Char4Activity.this, "返回已收到", Toast.LENGTH_LONG).show();

            }

             break;

        }

}

 

这里需要注意的是resultCode相当于1个开关,当NextActivity.java中的开关打开时, 就会进行相应的处理了。

修改NextActivity的onCreate方法:

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.next);

    setResult(RESULT_OK);

    finish();

}

 

下面,我们来看看效果,如图4⑹所示:

图4⑹ Activity跳转后返回值

 

4.1.6 Activity中数据传递

很多时候,我们不是单单只进行Activity跳转,而是在进行Activity跳转的同时传递数据,这里我们就能够利用Android.os.Bundle对象封闭数据的能力,将所要传递的数据或参数通过Bundle来传递不同Activity间的数据。还以之前的代码为例,我们要实现从当前Activity跳转到下1个Activity的同时,并传入1个double型参数,1个String型参数,在MyActivity.java中代码以下:

Intent intent = new Intent();
intent.setClass(MyActivity.this, NextActivity.class);

Bundle bundle = new Bundle();

double height = 1.74;

String name = "li lei";

bundle.putDouble("height", height);

bundle.putString("name",name);

intent.putExtras(bundle);
startActivity(intent);

 

有1方发送参数,就必定有1方要接收参数。它的接收实现起来也很简单,在NextActivity.java中代码以下:

Bundle bundle = NextActivity.this.getIntent().getExtras();

double height = bundle.getDouble("height");

String name = bundle.getString("name");

 

经验分享:

需要注意的是,当履行startActivityForResult时,requestCode值需要>=0,否则,startActivityForResult就变成了 startActivity;另外,有这样1种情况,假定现在有两个Activity:A和B。Activity A使用startActivityForResult跳转到Activity B,跟踪后发现要跳转的Activity B并没有被立即启动,而是直接履行了Activity A的onActivityResult方法,缘由是把要启动的Activity B的launchmode设置成singleTask了,这个时候它会先履行onActivityResult方法,然后再启动activity,所以就得不到我们想要的结果。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐