首页 > Android > Android之Activity之间的参数传递

Android之Activity之间的参数传递

前面写了很多activity的东西,什么生命周期之类、常用控件以及这些控件怎么布局之类的,今天从另外一个角度在看activity:一个应用其实就是不同activity的切换,然后展示一些数据给用户,但是不同的activity之前肯定有着联系,那么他们之间怎么联系呢?说白了就是他们之间的参数是如何传递的呢?在讲不同的activity之间相互传参之前,我们先看这样两个问题:①:我们有时候需要从一个activity跳转到另一个activity,并且同时把参数带过去,然后一般就没有第一个activity啥事了,这个很常见所以就不举例子了,我们暂且称这一种为:普通的参数传递;②:有些时候呢,却不是这样,我们需要在第一个activity中打开第二个activity,在第二个activity中选取一个内容后,把我们选取的参数带回第一个activity,然后在第一个activity中处理带回来的参数,例如:我们在上传头像时,我们在第一个activity中,打开第二个activity,然后在第二个activity中,选取图片、裁剪图片,然后把处理好之后的图片带回到第一个activity,我们暂且称这种叫:关心结果的参数传递。
在明白有这两种需求之后,我们发现不同的activity之间参数传递其实很简单,不同的activity之间传递参数是依靠一个对象:android.content.Intent,只要有这个对象就可以满足我们在不同的activity之间传递参数的需求了。下面就让我们结合这两种情况,看看不同activity之间参数如何传递。

一、普通的参数传递
废话不多说,先看例子:

主activity的代码如下:

package cn.bridgeli.demo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    private EditText factorOne = null;
    private TextView symbol = null;
    private EditText factorTwo = null;
    private Button calc = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        factorOne = (EditText) findViewById(R.id.factorOne);
        symbol = (TextView) findViewById(R.id.symbol);
        symbol.setText("乘以");
        factorTwo = (EditText) findViewById(R.id.factorTwo);

        calc = (Button) findViewById(R.id.calc);
        calc.setText("计算");
        calc.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String firstNum = factorOne.getText().toString();
                String secondNum = factorTwo.getText().toString();
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, ResultActivity.class);
                intent.putExtra("firstNum", firstNum);
                intent.putExtra("secondNum", secondNum);
                startActivity(intent);
            }
        });
    }
}

其对应的布局文件:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.bridgeli.demo.MainActivity" >

    <EditText 
        android:id="@+id/factorOne"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    
    <TextView
        android:id="@+id/symbol"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    
    <EditText 
        android:id="@+id/factorTwo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    
    <Button 
        android:id="@+id/calc"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

在MianActivity中第38行,就是说明从一个activity跳转到另一个activity,41行就是启动另一个activity,参数intent中封装了要传递过去的所有参数,下面让我们看看ResultActivity的代码:

package cn.bridgeli.demo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class ResultActivity extends Activity {

    private TextView result = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);

        Intent intent = getIntent();
        int firstNum = Integer.parseInt(intent.getStringExtra("firstNum"));
        int secondNum = Integer.parseInt(intent.getStringExtra("secondNum"));
        int temp = firstNum * secondNum;

        result = (TextView) findViewById(R.id.result);
        result.setText(temp + "");

    }
}

对应的布局文件activity_result.xml就比较简单了,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.bridgeli.demo.MainActivity" >

    
    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

因为代码比较简单,老夫就不多啰嗦了,相信读者一看就明白了。需要说明白的是,每一个activity都需要在mainifest.xml中进行配置,配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.bridgeli.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

</manifest>

在这个配置文件里面有很多东西,目前我们只需要关注activity的配置就行了,这样的话相信读者一看就明白了,需要多说一句的是:一个app既然有很多个不同的activity,那么这些activity哪一个是启动的主activity呢?就是哪个是app启动起来我们看到的第一个activity呢?很简单,就是有配置:

			<intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

的那一个。
如果有看过我之前的文章的同学,相信已经发现我在前面写常见控件的那篇文章时,已经写过,当时只是没说那么明白而已,下面我们看第二种

二、关心结果的参数传递

同样废话不多说,直接看例子,主activity的代码如下:

package cn.bridgeli.demo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private Button start = null;
    private TextView result = null;
    public static final int REQUSET = 1;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == MainActivity.REQUSET && resultCode == RESULT_OK) {
            String str = "账号:" + data.getStringExtra(RequestActivity.USERNAME) + "n" + "密码:" + data.getStringExtra(RequestActivity.PASSWORD);
            result.setText(str);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        result = (TextView) findViewById(R.id.result);
        start = (Button) findViewById(R.id.start);
        start.setText("启动");
        start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, RequestActivity.class);
                startActivityForResult(intent, REQUSET);
            }
        });

    }
}

其实经过这么多相信大家也应该猜到了,布局文件activity_main也会很简单,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.bridgeli.demo.MainActivity" >

    <Button 
        android:id="@+id/start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

另一个activity的代码如下:

package cn.bridgeli.demo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class RequestActivity extends Activity {

    private Button start = null;
    private EditText username = null;
    private EditText password = null;
    public static final String USERNAME = "username";
    public static final String PASSWORD = "password";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);

        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);
        start = (Button) findViewById(R.id.start);
        start.setText("计算");
        start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra(USERNAME, username.getText().toString());
                intent.putExtra(PASSWORD, password.getText().toString());
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

对应的布局文件activity_result代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.bridgeli.demo.MainActivity" >

    
     <EditText 
        android:id="@+id/username"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:hint="username"/>
    
    <EditText 
        android:id="@+id/password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:hint="password"/>
    
    <Button 
        android:id="@+id/start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

代码比较简单就不多啰嗦了,读者自己看吧,相信以读者的聪明一看就会很明白,另外这个例子对应的mainifest文件和上一个例子几乎一样,就省去不写了

PS:第一次写Android的东西,既是初学还是自学,也没做过项目,所以不免有错误的地方和有点抓不住重点,还请大家能留言交流,谢谢

分享到:
作 者: BridgeLi,http://www.bridgeli.cn/
原文链接:https://www.bridgeli.cn/archives/143
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Android 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.