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,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/143
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论