1. 程式人生 > >Android 元件系列之Activity的傳值和回傳值

Android 元件系列之Activity的傳值和回傳值

在這篇隨筆裡將講解Activity的傳值和回傳值。

一、通過startActivity來進行Activity的傳值

在Android中,如果我們要通過一個Activity來啟動另一個Activity,可以使用 startActivity(Intent intent)方法來傳入一個Intent物件,這個Intent物件我們可以精確的指定我們需要跳轉的Activity上,或者通過Intent物件來 指定我們要完成的一個action操作。

①.通過setClass方法來指定我們要跳轉的Activity

Intent intent = new Intent();

intent.setClass(MainActivity.

this, SecondActivity.class);

②.通過setAction方法來我們要完成的一個action操作

Intent  intent = new Intent();

intent.setAction("com.xiaoluo.android_intent.second");

通過這種方式可以來指定我們的Intent物件要完成某個操作,這個操作可以是啟動一個Activity,我們可以在 AndroidManifest.xml中在 <Activity> 元素下指定一個 <intent-filter> 物件,然後其子元素宣告一個 <action> 元素,這樣我們可以將這個action動作繫結到了這個Activity上,即Android作業系統會去找與intent物件中指定的action名字 的 <intent-filter>物件,然後執行相應的動作,例如:

     <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物件,在啟動時,就會找到名字為 com.xiaoluo.android_intent.second 的<intent-filter>物件,來啟動我們的SecondActivity。

我們來看看如何在Activity物件中進行值的傳遞,也是通過 Intent 物件的各種putExtra方法來進行傳遞:

MainActivity:

public class MainActivity extends Activity

{

private Button button;

@Override

protected 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

{

@Override

public 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); // 第一個引數指定name,android規範是以包名+變數名來命名,後面是各種型別的資料型別

intent.putExtra("com.xiaoluo.android_intent.name", "xiaoluo");

Bundle bundle = new Bundle();  //  Bundle的底層是一個HashMap<String, Object

bundle.putString("hello", "world");

intent.putExtra("bundle", bundle);

      startActivity(intent);

}

}

@Override

public 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";

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.second);

textView = (TextView)findViewById(R.id.textView);

//    得到跳轉到該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);

}

}

在第二個Activity物件中,可以通過 getIntent() 方法來得到跳轉到這個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-sdk

android:minSdkVersion="8"

android:targetSdkVersion="18" />

    <application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

        <activity

android: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>

這樣我們就可以實現Activity直接的值的傳遞。

二、通過startActivityForResult方法來得到Activity的回傳值

在一些情況下,我們通過 A activity跳轉到 B activity上,這時希望 A activtiy能從 B activity上得到一些返回值,這個時候我們就不能使用startActivity方法了,而是使用 startActivityForResult方法來完成我們的操作。

例如,我們希望完成下面一個功能,在MainActivity上,寫上一個算術表示式,然後跳轉到到第二個SecondActivity上,在這個 Activity上將第一個Activity的表示式顯示出來,然後我們可以輸入我們的算術表示式結果,然後點選按鈕,將這個結果值又返回給我們的 MainActivity,並將結果填充到算術表示式中,具體看如下程式碼:

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" >

    <EditText

android:id="@+id/editText1"

android:layout_width="70dp"

android:layout_height="wrap_content" />

    <TextView

android:id="@+id/textView1"

android:layout_width="60dp"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/editText1"

    android:text=" + "

android:textSize="30sp" />

    <EditText

android:id="@+id/editText2"

android:layout_width="60dp"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/textView1" />

    <TextView

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/editText2"

android:text=" = "

android:textSize="30sp" />

    <EditText

    android: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="跳轉到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" >

    <TextView

android: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>

然後我們來看看兩個Activity

MainActivity:

public class MainActivity extends Activity

{

private Button button;

private EditText editText1;

private EditText editText2;

private EditText editText3;

  @Override

protected 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()

{

@Override

   public 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);

/*

* 如果希望啟動另一個Activity,並且希望有返回值,則需要使用startActivityForResult這個方法,

* 第一個引數是Intent物件,第二個引數是一個requestCode值,如果有多個按鈕都要啟動Activity,則requestCode標誌著每個按鈕所啟動的Activity

               */

startActivityForResult(intent, 1000);

}

});

}

/**

* 所有的Activity物件的返回值都是由這個方法來接收

* requestCode:    表示的是啟動一個Activity時傳過去的requestCode值

* resultCode:表示的是啟動後的Activity回傳值時的resultCode值

* data:表示的是啟動後的Activity回傳過來的Intent物件

*/

@Override

protected 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);

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

我們看到,這裡我們使用的是 startActivityForResult 的這個方法,

public void startActivityForResult (Intent intent, int requestCode)

Same as calling startActivityForResult(Intent, int, Bundle) with no options.

Parameters

intentThe intent to start.

requestCodeIf >= 0, this code will be returned in onActivityResult() when the activity exits.

Throws   android.content.ActivityNotFoundException

第一個指定我們的Intent物件,第二個requestCode指定我們的一個啟動標誌值,因為我們可能有多個按鈕,如果都是跳轉到同一個Activity物件上,我們需要對其進行標誌,才知道是哪個Activity物件跳轉過來的。

我們看到這裡還有一個 onActivityResult 方法,這個方法就是用來處理我們Activity的回傳值的方法,所有的Activity回傳值的操作都是在這個方法中完成。

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

requestCodeThe integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.

resultCodeThe integer result code returned by the child activity through its setResult().

dataAn Intent, which can return result data to the caller (various data can be attached to Intent "extras").

接下來,我們看看SecondActivity這個類:

public class SecondActivity extends Activity

{

private Button button;

private TextView textView;

private EditText editText;

@Override

protected 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()

{

@Override

public void onClick(View v)

   {

String result = editText.getText().toString().trim();

Intent intent = new Intent();

intent.putExtra("result", result);

/*

* 呼叫setResult方法表示我將Intent物件返回給之前的那個Activity,這樣就可以在onActivityResult方法中得到Intent物件,

*/

setResult(1001, intent);

//    結束當前這個Activity物件的生命

finish();

}

});

}

}

這個類裡面我們將MainActivity傳過來的值給TextView賦上,然後通過點選按鈕將值回傳給我們的 MainActivity,通過 setResult 方法可以將我們的值儲存在Intent物件中,並返回給MainActivity物件,通過的 onActivityResult 方法來處理得到的回傳Intent物件。finish()方法我們可以顯示的結束這個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-sdk

android:minSdkVersion="8"

android:targetSdkVersion="18" />

    <application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

        <activity

android: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>

        <activity

android:name="com.xiaoluo.android_activity.SecondActivity"

android:label="SecondActivity" >

        </activity></application>

</manifest>

我們來看看效果圖:

相關推薦

Android 元件系列Activity回傳

在這篇隨筆裡將講解Activity的傳值和回傳值。 一、通過startActivity來進行Activity的傳值 在Android中,如果我們要通過一個Activity來啟動另一個Activity,可以使用 startActivity(Intent intent)方法來

Android 元件系列-----Activity回傳

在這篇隨筆裡將講解Activity的傳值和回傳值。 一、通過startActivity來進行Activity的傳值 在Android中,如果我們要通過一個Activity來啟動另一個Activity,可以使用 startActivity(Intent intent)方法來

《React-Native系列元件封裝Dialog(iOSAndroid通用)

最近在專案中封裝了個Dialog元件,iOS和Android平臺上通用。 元件Dialog顯示時,從頁面頂部滑動到中間,點選確認或取消後,從頁面底部劃出頁面,需要注意動畫的實現。 原始碼如下: [javascript] view plain copy

Android 進階】仿抖音系列視訊預覽錄製(五)

大家好,又見面了。在前幾篇中,我們通過2種方式實現了仿抖音的翻頁切換視訊,仿抖音列表播放視訊功能,這一篇,我們來說說視訊的錄製。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二) 【Android

Android 元件系列 -- Activity 啟動流程(9.0)

在學習完Android應用程式啟動過程原始碼分析,針對最新Android9.0的程式碼,以相應的順序再次學習。在9.0的版本中對於Activity的啟動流程上並沒有太大的變化,但是在程式碼層面,改動的卻很多。 流程概覽 以Launcher啟動APP為例: Lau

android開發二、Activity給Fragment

這是一個深坑,也許是我沒寫好,網上搜了很多方法,現在主要是利用Fragment中的newInstance方法,可照搬了很多,就是無法傳值。在Fragment中始終接收不到要傳的值。搜了一天,終於發現了有一篇中的程式碼有點小小不同,試了一下,果然傳進去了。 原來Acitivity的程式碼:(此種方

Android控制元件系列RadioButton與RadioGroup的基本使用

RadioButton即單選框,是一種基礎的UI控制元件。RadioGroup為我們提供了RadioButton單選按鈕的容器,RadioButton通常放於RadioGroup容器中進行使用。RadioButton的選中狀態,在xml檔案中可以使用android:chec

Android元件不同模組間 互動(activity互相跳轉,資料互相傳遞,互相呼叫函式)

 轉載請標明地址:https://blog.csdn.net/gaolei1201/article/details/77601027 在元件化之前,業務發展不是很快的時候,這樣是比較合適的,能一定程度地保證開發效率。 慢慢地程式碼量多了起來,開發人員也多了起來,業務發展也

Android控制元件系列RadioButton&RadioGroup

學習目的: 1、掌握在Android中如何建立RadioGroup和RadioButton 2、掌握RadioGroup的常用屬性 3、理解RadioButton和CheckBox的區別 4、掌握RadioGroup選中狀態變換的事件(監聽器) RadioButton和CheckBox的區別:

Android系列Activity

Activity,活動介面。直接與使用者進行交流的橋樑。包含了所有該應用需要與使用者互動的元件。 如何生成一個Activity呢?(本文的IDE是Eclipse) 在src資料夾下新建一個包,在包下新建自己的Activity。在新建的Activity中,就要

Android元件複習基本元件05—時鐘元件DigitalClockAnalogClock

時鐘元件DigitalClock和AnalogClock功能和使用及TextClock。 1、時鐘UI元件是兩個非常簡單的元件,DigitalClock本身就集成了TextView—也就是說它本

Android Service向Activity引數資料

作為Android開發人員來說,Activity 向Service傳資料很容易,用Intent跳轉的時候攜帶資料,但是Service向Activity傳資料對於剛接觸可能相對有點難度,所以,此篇部落格記錄下Service向Activity用廣播傳值。 An

Android動畫系列幀動畫補間動畫

> 原文首發於微信公眾號:jzman-blog,歡迎關注交流! Android 提供三種動畫:幀動畫、補間動畫和屬性動畫,本篇文章介紹幀動畫以及補間動畫的使用,屬性動畫的使用將在後面的文章中分享,那就來複習一下這兩種動畫的使用吧。 #### FrameAnimation FrameAnimatio

Android開發系列SQLite

分組 ets ket where pla 情況 流行 database which 上篇博客提到過SQLite。它是嵌入式數據庫,因為其輕巧但功能強大,被廣泛的用於嵌入式設備其中。後來在智能手機、平板流行之後,它作為文件型數據庫,差點兒成為了智能設備單機數據庫的必選,能夠

Android開發系列學習路線圖

權限 原生開發 edi post 設計 多少 方法 b2c art 通過前面的3篇博客已經簡單的介紹了Android開發的過程並寫了一個簡單的demo,了解了Android開發的環境以及一些背景知識。接下來這篇博客不打算繼續學習Android開發的細節,先停一下,明白一下

談談-Android-PickerView系列源碼解析(二)

需求 動態 () comm tag 多個 來源 ntc 寬高 前言   WheelView想必大家或多或少都有一定了解, 它是一款3D滾輪控件,效果類似IOS 上面的UIpickerview 。按照國際慣例,先放一張效果圖:   以上是Android-PickerView

Android回顧系列——HttpUrlConnect的使用

nco 留言 要求 idc stream extends value tput 回調 寫在前面:   最近準備一個關於Android的比賽。由於賽項要求,不得使用第三方工具、框架;故最近來溫習一下Google官方提供的原始API的使用。   說實話,用慣了第三方的庫,再

mysql系列5--完全備份增量備份

bsp 定時 實時 sta form sql -a posit 密碼 一、利用系統自帶的工具實現完全備份:mysqldump1、備份所有的數據庫: mysqldump -hlocalhost -uroot -p12345678 --all-database

從產品展示頁面談談Hybris系列二: DTO, ConverterPopulator

ext 存儲 resource tar adl 裏的 resolve 個數 lis 文章作者:張健(Zhang Jonathan) 上一篇文章 從產品展示頁面談談Hybris的特有概念和設計結構 我們講解了Hybris一些特有的概念以及大體架構,並且介紹了Facade層裏是

python全棧系列---cookie模擬登陸模擬session原理

ger -c AD log print imp 數據庫 sta 這一 cookie模擬登陸: import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self):