1. 程式人生 > >Android學習筆記(8)————詳細談談intent的startActivityForResult()方法

Android學習筆記(8)————詳細談談intent的startActivityForResult()方法

/********************************************************************************************
 * author:[email protected]大鐘                                                                                                                          
 * E-mail:[email protected]                                                                                                             
 *

http://blog.csdn.net/conowen                                                                                                              
 * 注:本文為原創,僅作為學習交流使用,轉載請標明作者及出處。     
 ********************************************************************************************/

1、兩種實現activity跳轉的方法

      實現activity的跳轉主要有兩種方法,startActivity

()和startActivityForResult();

例如activity A跳轉到activity B

        對於,第一種,是把activity A的資料,通過intent傳送到activity B,但是不能返回資料。

         關於第一種,可以參考我之前的這篇博文

http://blog.csdn.net/conowen/article/details/7270393

2、第二種方法startActivityForResult()的詳細用法

       今晚談的是第二種方法startActivityForResult();可以實現把activity A資料傳送給activity B,也可以把activity B的資料返回來給activity  A處理。

public void startActivityForResult (Intent intent, int requestCode) 

           首先startActivityForResult 有兩個引數,第一個為當前activity的intent(假設為activity A),至於第二個引數的用法,還是先看一下官方SDK文件的解釋
requestCode  :   If >= 0, this code will be returned in onActivityResult() when the activity exits.

             一般都是設定大於或者等於0,因為activity A可能不單單要跳轉到activity B,也可能跳轉到activity C,D,E……,這些activity返回來的資料都交由activity處理,那activity又通過什麼來分辨返回來的資料到底是哪個activity回來的呢。

         所以在activity A跳轉到某一個activity時,要設定目標activity的requestCode,這個requestCode就唯一地標識了相對應的activity。

如下所示,當要跳轉到activity B時,15表示是activity B的標識,

IntentActivity.this.startActivityForResult(intent, 15);
同理,當在activity A的另外一個監聽器要跳轉到activity C時,設定activity C的標識為25。(大於或者等於0就行了)
IntentActivity.this.startActivityForResult(intent, 25);

(通過onActivityResult方法可處理代表不同activity的requestCode數值,詳細用法在第3點。)

3、資料處理方法onActivityResult()詳解

       然後activity A通過複寫onActivityResult方法來處理這些activity返回來的資料。onActivityResult定義如下:

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

3.1、資料處理方法onActivityResult()有三個引數,第一個requestCode是用來區分哪個activity回來的資料,可以通過swith語句來篩選。


基本框架程式碼如下:

switch (requestCode) {
		case 15:
			switch (resultCode) {
			case 0:
				//do something

				break;
			case 1:
				//do something
                  
                       break;
			default:
				break;
			}
			break;
		case 25:
			switch (resultCode) {
			case 0:			
 				//do something
				break;
			default:
				break;
			}
               default:
                        break;
       }

3.2、第二個引數為resultCode,也是一個int型別,如果activity B有幾種不同返回的結果,同樣地可以通過resultCode來篩選。

       當跳轉到其他activity時,如activity B。需要知道的是,把activity B的資料返回去給activity A的處理方法是setResult (int resultCode, Intent data) ,可以看到它的第一個引數是resultCode,也就是對應著相應的處理方式,官方的推薦取值如下,這些是巨集變數,實質是int。當然也可以自定義為數值,自己習慣就行了。

RESULT_CANCELED
RESULT_OK
RESULT_FIRST_USER

具體做法如下:如你可以在activity B做如下設定,兩個button的監聽器對應著兩個resultCode,也就對應了兩種處理方式,至於你要做什麼事,在監聽器定義即可。

                button1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//do something
				secondactivity.this.setResult(0, intent);
				secondactivity.this.finish();

			}
		});
		
		button2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				//do something
				secondactivity.this.setResult(1, intent);
				secondactivity.this.finish();
			}
		});

3.3、第三個引數為Intent data,為activity返回來的數值,如通過data.getStringExtra("key");就可以取出來。

注意:呼叫setResult()方法跳回原來的activity時,一定要呼叫finish方法結束當前的activity

另外,如果activity A只需要跳轉到activity B而已,那跳轉時,request code只要大於或者等於0就行,而資料處理的方法onActivityResult()如下結構就行了,不用篩選request code。

			switch (resultCode) {
			case 0:
				//do something

				break;
			case 1:
				//do something
                  
                       break;
			default:
				break;
			}
			

===============================================================================================

附上詳細程式碼

從第一個activity跳到第二個,主要是驗證 resultCode,

從第一個activity跳到第三個activity 和跳到第二個activity,主要是驗證requestCode

效果圖:


//IntentActivity為第一個activity

package conowen.Activity.intent;

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;
import android.widget.Toast;

public class IntentActivity extends Activity {

	/** Called when the Activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button bt = (Button) findViewById(R.id.bt);
		Button bt2 = (Button) findViewById(R.id.bt13);

		bt.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(IntentActivity.this,
						secondactivity.class);
				// 將intent繫結到第二個activity,然後開始跳轉到第二個Activity
				IntentActivity.this.startActivityForResult(intent, 15);
				// 第二個引數為requestCode,大於或等於0,

			}
		});

		bt2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(IntentActivity.this,
						requestCodetest.class);//將intent繫結在第三個activity
				IntentActivity.this.startActivityForResult(intent, 25);

			}
		});

	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		switch (requestCode) {// 通過requestCode來辨別資料來自哪個activity
		case 15:// 取得來自Activity2的資料,並顯示於畫面上
			switch (resultCode) {// 通過resultCode來辨別activity的相應處理方法

			case 0:

				String resultstr1 = data.getStringExtra("result");// 取出傳回來的資料
				TextView tv = (TextView) findViewById(R.id.tv);
				tv.setText(resultstr1);// 顯示出來

				break;
			case 1:

				String resultstr2 = data.getStringExtra("result");
				TextView tv1 = (TextView) findViewById(R.id.tv);
				tv1.setText(resultstr2);
				Toast.makeText(this,
						"第2個activity的requestCode的值為" + requestCode,
						Toast.LENGTH_LONG).show();

				break;
			default:
				break;
			}
			break;
		case 25:
			switch (resultCode) {
			case RESULT_OK:

				String resultstr3 = data.getStringExtra("result3");
				Toast.makeText(this,
						"第3個activity的requestCode的值為" + requestCode,
						Toast.LENGTH_LONG).show();
				TextView tv = (TextView) findViewById(R.id.tv);
				tv.setText(resultstr3);

				break;
			default:
				break;
			}
		default:
			break;

		}

	}
}


//secondactivity為第二個activity
package conowen.Activity.intent;

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 secondactivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.secondactivity);

		// 獲取啟動這個activity的intent
		Button returnbt1 = (Button) findViewById(R.id.returnbt1);
		final Intent intent = getIntent();
		returnbt1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				EditText et = (EditText) findViewById(R.id.et);
				String res = et.getText().toString();
				intent.putExtra("result", res);// 把資料塞入intent裡面
				secondactivity.this.setResult(0, intent);// 跳轉回原來的activity
				secondactivity.this.finish();// 一定要結束當前activity

			}
		});
		Button returnbt2 = (Button) findViewById(R.id.returnbt2);
		returnbt2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				intent.putExtra("result", "驗證result code");
				secondactivity.this.setResult(1, intent);
				secondactivity.this.finish();
			}
		});

	}

}

//requestCodetest是第三個activity

package conowen.Activity.intent;

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 requestCodetest extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.requestcode);// layout的xml檔名不能為大寫字母

		Button bt3 = (Button) findViewById(R.id.returnbt3);

		bt3.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 這個activity主要是為了驗證requestCode
				EditText et3 = (EditText) findViewById(R.id.et3);
				Intent intent = getIntent();// 獲取啟動這個activity的intent
				String res = et3.getText().toString();
				intent.putExtra("result3", res);
				requestCodetest.this.setResult(RESULT_OK, intent);
				requestCodetest.this.finish();

			}
		});

	}

}



相關推薦

Android學習筆記(8)————詳細談談intent的startActivityForResult()方法

/********************************************************************************************  * author:[email protected]大鐘         

Android學習筆記詳細講解畫圓角圖片

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記8-使用通知(Notification)

Android學習筆記8-使用通知(Notification) 1.Notification簡介 通知是Android系統的一種特色的功能,當某個app希望給使用者提示資訊,但是該app又不在執行在前臺時,就可以利用通知。 傳送一條通知後,手機上方的狀態列就會顯示一個小圖示,

Android學習筆記8&s3c2440學習系列9

今天把andriod系統初步load到了mini2440上面執行,依然還有很多問題需要自己去摸索: 我把檔案系統中的,#service servicemanager /system/bin/servicemanager 因為會出現下面的問題:init: critical

python學習筆記8--面向對象--屬性和方法詳解

confirm 報錯 方式 系列 dep 是個 應用 all icm 屬性:   公有屬性 (屬於類,每個類一份)   普通屬性 (屬於對象,每個對象一份)   私有屬性 (屬於對象,跟普通屬性相似,只是不能通過對象直接訪問) 方法:(按作用)   構造方法  

[機器學習]ID3決策樹 詳細計算流程 周志華機器學習 筆記 原創Excel手算方法

1.用到的主要三條熵公式: 1.1 資訊熵 詳情見夏農資訊理論 概率越平衡 事件所含有的資訊量越大 1.2 條件熵 代表某一屬性下不同分類的資訊熵之和 1.3 資訊增益 等於資訊熵減去條件熵,從數值上,越大的資訊增益在資訊熵一定的情況下,代表條件熵越小,條件熵越

架構師學習筆記8--系統分析與設計方法

系統設計是架構師的看家本領,但設計基於系統分析。系統架構師在專案管理師的協調下,與系統分析師協同工作。 一、定義問題與歸結模型 軟體系統的目的是解決問題,所以軟體開發第一步是定義和分析問題,在此基礎上歸結模型。 定義問題的過程包括,理解真實世界中的問題和使

Android學習筆記整理(8)--Activity的顯式意圖和隱式意圖

Android中Intent尋找目標元件的方式分為兩種,一種是顯式意圖,另一種是隱式意圖1.顯式意圖在通過Intent啟動Activity時,需要明確指定啟用元件的名稱。在程式中,如果需要在本應用中啟動

Android學習筆記--GMS認證中常見的fail項及解決方法

############################################################# cts測試的一些命令:     sudo chmod a+x copy_media.sh     ./copy_media.sh all     ad

(Android) OkHttp3.10 原始碼學習筆記 8 Cahce get put分析&& CacheInterceptor分析

今天我們來分析OkHttp中的cache攔截器。使用cache的方簡單如下 OkHttpClient client = new OkHttpClient().newBuilder().cache(new Cache(new File("cache"), 24 * 1024 * 1024)).bu

Android學習筆記2 TextView圖文混排,顯示新增的圖片,三種常用方法,親測

圖文混排,文字就不說了,主要是顯示圖片的方法 1、TextView使用ImageSpan顯示圖片 ImageSpan span = new ImageSpan(this, R.drawable.ic_launcher);//載入圖片的資源 SpannableStrin

Android學習筆記:介面設計Material Design的基本使用方法(二)

四、卡片式佈局1、使用CardView實現卡片式佈局CardView由appcompat-v7庫提供,它也是一個FrameLayout,只是額外的提供了圓角和陰影等效果。CardView的使用方法:<android.support.v7.widget.CardView

Pro Android學習筆記(一三七):Home Screen Widgets(3):配置Activity

map onclick widgets info xtra ces extends height appwidget 文章轉載僅僅能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處http://blog.csdn.net/flowingfly

Android學習筆記-TextView(文本框)(二)

com ddc tel spanned extra pac 全部 con 平時 文章參考自:http://www.runoob.com/w3cnote/android-tutorial-textview.html 2.4 使用autoLink屬性識別鏈接類型 當文字中出

Cocos2D-X2.2.3學習筆記8(處理精靈單擊、雙擊和三連擊事件)

屏幕 () rtu cati 輸出 public exit 什麽是 avi 我們依據上一次介紹的觸屏事件和事件隊列等知識來實現觸屏的單擊,雙擊,三連擊事件。 下圖為我們實現的效果圖: 單擊精靈跳躍一個高度, 雙擊精靈跳躍的高度比單擊的高 三連擊精靈跳躍的跟高

Android學習筆記-ImageView(圖像視圖)

尺寸 map 顯示 htm 通過 加載 內容 github bit 原文來自:http://www.runoob.com/w3cnote/android-tutorial-imageview.html 本節引言: 本節介紹的UI基礎控件是:ImageView(圖像視圖)

Android學習筆記-繪制圓形ImageView實例

eight font private cte class get wid actor oid 現在很多的APP都很喜歡圓形的頭像,這裏就簡單的寫個圓形的ImageView~ 第三方圓形ImageView控件: RoundedImageView CircleImageView

Pro Android學習筆記 ActionBar(1):Home圖標區

ces tom 新的 方便 find rac vertica lba manifest ?? Pro Android學習筆記(四八):ActionBar(1):Home圖標區 2013年03月10日 ? 綜合 ? 共 3256字 ? 字號 小 中 大 ? 評論關閉

udacity android 學習筆記: lesson 4 part a

odi todo col 數據庫版本 pretty define all 大致 lec udacity android 學習筆記: lesson 4 part a 作者:幹貨店打雜的 /titer1 /Archimedes 出處:https://

Android學習筆記:超能RecyclerView組件使用總結

popu bin view設置 and col cas mda rac data 個人認為 RecyclerView組件確實值得學習並用到我們的項目中去,前面學了相關的內容。今天再補充一些相關的東東。 1,實現對RecyclerView中的數據進行加入和刪除操作。