Android 组件系列-----Activity的传值和回传值
在這篇隨筆里將講解Activity的傳值和回傳值。
一、通過startActivity來進(jìn)行Activity的傳值
在Android中,如果我們要通過一個(gè)Activity來啟動另一個(gè)Activity,可以使用 startActivity(Intent intent)方法來傳入一個(gè)Intent對象,這個(gè)Intent對象我們可以精確的指定我們需要跳轉(zhuǎn)的Activity上,或者通過Intent對象來指定我們要完成的一個(gè)action操作。
①.通過setClass方法來指定我們要跳轉(zhuǎn)的Activity
Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class);②.通過setAction方法來我們要完成的一個(gè)action操作
Intent intent = new Intent(); intent.setAction("com.xiaoluo.android_intent.second");通過這種方式可以來指定我們的Intent對象要完成某個(gè)操作,這個(gè)操作可以是啟動一個(gè)Activity,我們可以在AndroidManifest.xml中在 <Activity> 元素下指定一個(gè) <intent-filter> 對象,然后其子元素聲明一個(gè) <action> 元素,這樣我們可以將這個(gè)action動作綁定到了這個(gè)Activity上,即Android操作系統(tǒng)會去找與intent對象中指定的action名字的 <intent-filter>對象,然后執(zhí)行相應(yīng)的動作,例如:
<activity android:name="com.xiaoluo.android_intent.SecondActivity"android:label="SecondActivity"><intent-filter><action android:name="com.xiaoluo.android_intent.second"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></activity>這樣我們的Intent對象,在啟動時(shí),就會找到名字為?com.xiaoluo.android_intent.second 的<intent-filter>對象,來啟動我們的SecondActivity。
我們來看看如何在Activity對象中進(jìn)行值的傳遞,也是通過 Intent 對象的各種putExtra方法來進(jìn)行傳遞:
MainActivity:
public class MainActivity extends Activity {private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button)findViewById(R.id.button);button.setOnClickListener(new ButtonListener());}class ButtonListener implements OnClickListener{@Overridepublic void onClick(View v){ // Intent intent = new Intent(); // intent.setClass(MainActivity.this, SecondActivity.class);Intent intent = new Intent();intent.setAction("com.xiaoluo.android_intent.second");intent.putExtra("com.xiaoluo.android_intent.age", 20); // 第一個(gè)參數(shù)指定name,android規(guī)范是以包名+變量名來命名,后面是各種類型的數(shù)據(jù)類型intent.putExtra("com.xiaoluo.android_intent.name", "xiaoluo");Bundle bundle = new Bundle(); // Bundle的底層是一個(gè)HashMap<String, Objectbundle.putString("hello", "world");intent.putExtra("bundle", bundle);startActivity(intent);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu);return true;}}SecondActivity:
public class SecondActivity extends Activity {private TextView textView;private final String TAG = "SecondActivity";@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.second);textView = (TextView)findViewById(R.id.textView);// 得到跳轉(zhuǎn)到該Activity的Intent對象Intent intent = getIntent();int age = intent.getIntExtra("com.xiaoluo.android_intent.age", 10);String name = intent.getStringExtra("com.xiaoluo.android_intent.name");Bundle bundle = intent.getBundleExtra("bundle");String world = bundle.getString("hello");Log.i(TAG, age + ", " + name + ", " + world);textView.setText(name + " : " + age + ", " + world);System.out.println(intent);} }在第二個(gè)Activity對象中,可以通過 getIntent() 方法來得到跳轉(zhuǎn)到這個(gè)Activity的Intent對象,然后通過 Intent 對象的各種 getXXExtra 方法來得到我們的傳過來的值。
AndroidManifest.xml文件如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xiaoluo.android_intent"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="18" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.xiaoluo.android_intent.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="com.xiaoluo.android_intent.SecondActivity"android:label="SecondActivity"><intent-filter><action android:name="com.xiaoluo.android_intent.second"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></activity></application></manifest>這樣我們就可以實(shí)現(xiàn)Activity直接的值的傳遞。
二、通過startActivityForResult方法來得到Activity的回傳值
在一些情況下,我們通過 A activity跳轉(zhuǎn)到 B activity上,這時(shí)希望 A activtiy能從 B activity上得到一些返回值,這個(gè)時(shí)候我們就不能使用startActivity方法了,而是使用 startActivityForResult方法來完成我們的操作。
例如,我們希望完成下面一個(gè)功能,在MainActivity上,寫上一個(gè)算術(shù)表達(dá)式,然后跳轉(zhuǎn)到到第二個(gè)SecondActivity上,在這個(gè)Activity上將第一個(gè)Activity的表達(dá)式顯示出來,然后我們可以輸入我們的算術(shù)表達(dá)式結(jié)果,然后點(diǎn)擊按鈕,將這個(gè)結(jié)果值又返回給我們的MainActivity,并將結(jié)果填充到算術(shù)表達(dá)式中,具體看如下代碼:
activity_main.xml:
<RelativeLayout 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: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=".MainActivity" ><EditTextandroid:id="@+id/editText1"android:layout_width="70dp"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/textView1"android:layout_width="60dp"android:layout_height="wrap_content"android:layout_toRightOf="@id/editText1"android:text=" + "android:textSize="30sp" /><EditTextandroid:id="@+id/editText2"android:layout_width="60dp"android:layout_height="wrap_content"android:layout_toRightOf="@id/textView1" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/editText2"android:text=" = "android:textSize="30sp" /><EditTextandroid:id="@+id/editText3"android:layout_width="70dp"android:layout_height="wrap_content"android:layout_toRightOf="@id/textView2" /><Button android:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/editText3"android:layout_centerInParent="true"android:layout_marginTop="30dp"android:text="跳轉(zhuǎn)到SecondActivity"/></RelativeLayout>second.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:id="@+id/textView1"android:layout_width="70dp"android:layout_height="wrap_content"android:textSize="20sp"/><EditText android:id="@+id/editText1"android:layout_width="60dp"android:layout_height="wrap_content"android:layout_toRightOf="@id/textView1"/><Button android:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/editText1"android:text="返回給MainActivity"/></RelativeLayout>然后我們來看看兩個(gè)Activity
MainActivity:
public class MainActivity extends Activity {private Button button;private EditText editText1;private EditText editText2;private EditText editText3;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button)findViewById(R.id.button);editText1 = (EditText)findViewById(R.id.editText1);editText2 = (EditText)findViewById(R.id.editText2);editText3 = (EditText)findViewById(R.id.editText3);button.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){Intent intent = new Intent();intent.putExtra("message", editText1.getText().toString().trim() + " + " + editText2.getText().toString().trim() + " = ?");intent.setClass(MainActivity.this, SecondActivity.class);/** 如果希望啟動另一個(gè)Activity,并且希望有返回值,則需要使用startActivityForResult這個(gè)方法,* 第一個(gè)參數(shù)是Intent對象,第二個(gè)參數(shù)是一個(gè)requestCode值,如果有多個(gè)按鈕都要啟動Activity,則requestCode標(biāo)志著每個(gè)按鈕所啟動的Activity*/startActivityForResult(intent, 1000);}});}/*** 所有的Activity對象的返回值都是由這個(gè)方法來接收* requestCode: 表示的是啟動一個(gè)Activity時(shí)傳過去的requestCode值* resultCode:表示的是啟動后的Activity回傳值時(shí)的resultCode值* data:表示的是啟動后的Activity回傳過來的Intent對象*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);if(requestCode == 1000 && resultCode == 1001){String result_value = data.getStringExtra("result");editText3.setText(result_value);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.main, menu);return true;}}我們看到,這里我們使用的是?startActivityForResult 的這個(gè)方法,
public void startActivityForResult (Intent intent, int requestCode) Same as calling startActivityForResult(Intent, int, Bundle) with no options.Parameters intent The intent to start. requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits.Throws android.content.ActivityNotFoundException
第一個(gè)指定我們的Intent對象,第二個(gè)requestCode指定我們的一個(gè)啟動標(biāo)志值,因?yàn)槲覀兛赡苡卸鄠€(gè)按鈕,如果都是跳轉(zhuǎn)到同一個(gè)Activity對象上,我們需要對其進(jìn)行標(biāo)志,才知道是哪個(gè)Activity對象跳轉(zhuǎn)過來的。
我們看到這里還有一個(gè)?onActivityResult 方法,這個(gè)方法就是用來處理我們Activity的回傳值的方法,所有的Activity回傳值的操作都是在這個(gè)方法中完成。
protected void onActivityResult (int requestCode, int resultCode, Intent data) Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation. You will receive this call immediately before onResume() when your activity is re-starting.Parameters requestCode The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from. resultCode The integer result code returned by the child activity through its setResult(). data An Intent, which can return result data to the caller (various data can be attached to Intent "extras").接下來,我們看看SecondActivity這個(gè)類:
public class SecondActivity extends Activity {private Button button;private TextView textView;private EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.second);button = (Button)findViewById(R.id.button1);textView = (TextView)findViewById(R.id.textView1);editText = (EditText)findViewById(R.id.editText1);Intent intent = getIntent();String message = intent.getStringExtra("message").toString().trim();textView.setText(message);button.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){String result = editText.getText().toString().trim();Intent intent = new Intent();intent.putExtra("result", result);/** 調(diào)用setResult方法表示我將Intent對象返回給之前的那個(gè)Activity,這樣就可以在onActivityResult方法中得到Intent對象,*/setResult(1001, intent);// 結(jié)束當(dāng)前這個(gè)Activity對象的生命 finish();}});} }這個(gè)類里面我們將MainActivity傳過來的值給TextView賦上,然后通過點(diǎn)擊按鈕將值回傳給我們的 MainActivity,通過 setResult 方法可以將我們的值保存在Intent對象中,并返回給MainActivity對象,通過的 onActivityResult 方法來處理得到的回傳Intent對象。finish()方法我們可以顯示的結(jié)束這個(gè)Activity對象的生命。
最后我們來看一下AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xiaoluo.android_activity"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="18" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.xiaoluo.android_activity.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><activityandroid:name="com.xiaoluo.android_activity.SecondActivity"android:label="SecondActivity" ></activity></application></manifest>我們來看看效果圖:
?
轉(zhuǎn)載于:https://www.cnblogs.com/duanjt/p/4540139.html
總結(jié)
以上是生活随笔為你收集整理的Android 组件系列-----Activity的传值和回传值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux平台安装xtools
- 下一篇: js加载顺序测试