1. 程式人生 > >Android 學習之路一:Activity之間傳遞資料的四種方式

Android 學習之路一:Activity之間傳遞資料的四種方式

傳遞資料

  • 新建 Activity

在專案中右鍵,選擇 New,繼續選擇中下方的 Activity,最後是 Blank Activity。

此時 Android Studio 會為我們自動新增一個對應的佈局檔案,為佈局檔案中的 TextView 新增 ID,以便後續使用。

  • 用Intent 傳送資料

在主佈局檔案中新建一個 Button 控制元件,並在主類中定義它,然後為它設定 Click 的監聽事件。

    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super
.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this,Main2Activity.class); i.putExtra("Thanks"
,"Thank you for reading my blog."); startActivity(i); } }); }
  • 用 Intent 接收資料

接下來再之前建立的 Activity 中同樣新建一個 Intent 進行接受即可。和傳送試用的 putExtra 類似,接受也可以用 getStringExtra 。當然了,正對不同的資料型別可以用不同的方法。

private TextView tv;                                 

@Override                                            
protected
void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Intent i = getIntent(); tv = (TextView)findViewById(R.id.tv); tv.setText(i.getStringExtra("Thanks")); }

傳遞 Bundle 包

在兩個 Activity 之間也可以用 Bundle 包來進行資料的傳遞,相比上一種方式,這一種可以包含更多的資料,你可以將其認為是一個集合,這也正符合“包”的概念。

  • 新建 Bundle

  • Bundle 可以巢狀 Bundle

  • 對 Intent 物件使用 putExtras 方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,Main2Activity.class);
            Bundle a = new Bundle();
            a.putString("Thanks", "Thank you for reading my blog.");
            Bundle b = new Bundle();
            b.putString("Android","Google");
            b.putString("Windows","Microsoft");
            a.putBundle("bundle",b);
            i.putExtras(a);
            startActivity(i);
        }
    });
}
  • 根據相應的 Key 值獲取相應的Bundle資料
@Override                                                                       
protected void onCreate(Bundle savedInstanceState) {                            
    super.onCreate(savedInstanceState);                                         
    setContentView(R.layout.activity_main2);                                    

    Intent i = getIntent();                                                     

    Bundle a2 = i.getExtras();                                                  

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

    tv.setText(String.format("%s Android屬於%s,Windows屬於%s",                      
            a2.getString("Thanks"),                                             
            a2.getBundle("bundle").getString("Android"),                        
            a2.getBundle("bundle").getString("Windows")));                      
}                                                                               

傳遞自定義物件

Android 開發過程中自然少不了“類”了,那麼這種資料又如何傳輸呢。

  • 切記:一定要執行序列化,即加上“implements Serializable”
public class Source implements Serializable{
    private int source;
    private String ID;

    public int getSource() {
        return source;
    }

    public void setSource(int source) {
        this.source = source;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public Source(String ID, int source) {
        this.source = source;
        this.ID = ID;
    }
}

相應有了前面的瞭解,大家都可以直接猜到如何使用了,那我就不再囉嗦了。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,Main2Activity.class);
            i.putExtra("source",new Source("Player",1000));
            startActivity(i);
        }
    });
}
@Override                                                     
protected void onCreate(Bundle savedInstanceState) {          
    super.onCreate(savedInstanceState);                       
    setContentView(R.layout.activity_main2);                  

    Intent i = getIntent();                                   

    Source s = (Source) i.getSerializableExtra("source");     

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

    tv.setText(String.format("ID是%s,得分是%d",                   
            s.getID(), s.getSource()));                       
}                                                             

從Activity返回資料

使用者需要與應用進行互動,應用需要將使用者輸入的資料進行返回,所以……

在主 Activity 中定義 Button 和 TextView,前者用於導航至次 Activity , 後者用於顯示返回的資料。

在次 Activity 中定義 Button 和 EditText,前者用於確認並返回至主 Activity,後者用於使用者輸入。

在次 Activity 中:

  • 同樣用 Intent 傳遞資料

  • 用 setResult 設定返回結果

  • 最後用 finish

private Button button ;                                         
private EditText editText;                                      

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

    editText = (EditText)findViewById(R.id.editText);           
    button = (Button)findViewById(R.id.button2);                
    button.setOnClickListener(new View.OnClickListener() {      
        @Override                                               
        public void onClick(View v) {                           
            Intent i = new Intent();                            
            i.putExtra("info",editText.getText().toString());   
            setResult(0, i);  // 0表示成功                          
            finish();                                           
        }                                                       
    });                                                         
}                                                               

在主 Activity 中:

  • 用 startActivityForResult 進行導航,並請求結果
    private Button button;
    private TextView textView;

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

        textView = (TextView)findViewById(R.id.textView);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Main2Activity.class);

                startActivityForResult(i,0);
            }
        });
    }
  • 過載 onActivityResult 方法,並通過 data 引數獲取資料。
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        textView.setText(data.getStringExtra("info"));
    }

好了,Activity 之間就是這麼傳遞資料的……

我們用 startActivity 方法來啟動一個新的被放到 activity 堆疊頂部的 Activity 。如果希望在一個 activity 結束時獲得結果,就應該呼叫 startActivityForResult 方法,它的第二引數就是確認請求的請求碼。而返回的結果也會通過 onActivityResult 來獲取,如上程式碼所示,根據 Intent 獲取資料。

零點半了……睡覺……

本文為重複文章,僅為測試。

相關推薦

Android 學習Activity之間傳遞資料方式

傳遞資料 新建 Activity 在專案中右鍵,選擇 New,繼續選擇中下方的 Activity,最後是 Blank Activity。 此時 Android Studio 會為我們自動新增一個對應的佈局檔案,為佈局檔案中的 TextView 新增 I

我的Python學習Python學習路線

作為小白,在學習Python的時候,必然會走一定的彎路,有人在彎路上走丟了,有人走出了彎路。我就是屬於還未走出彎路的同學,所以我想談談我的Python學習之路。         我進入這個坑是因為這個最近幾年比較火,想必大家都知道吧,我開始學習Python

Golang 學習開發環境搭建

Golang 學習:開發環境搭建 一、下載適合本機的Golang版本 注意對應好自己PC 的system. Windows 直接下載對應的msi安裝即可,Linux注意發行版本。 本文L

QT學習(8)事件的傳遞和忽略

事件有兩個函式,accept()和event(),前者代表該元件希望接受這個事件,這個事件將不會傳播.而後者代表該元件希望忽略這個事件那麼事件就會繼續向它的父元件傳播.所有事件都是預設為accept()的,但是在QWidget中的所有事件回撥函式都是呼叫了ign

Android學習 Activity載入模式

在瞭解Activiry的四種載入模式之前,先得對棧有一定得理解,在這裡不再花篇幅去介紹棧。首先介紹下為何要制定載入模式一:為什麼要為Activity指定載入模式Android用Task來管理Activity棧,每建立一個Activity就會新建一個TASK棧或者新增到現有得T

android學習資料集合

notice 應用程序 好程序員 box bar 賬戶 from 匯總 ats 版權聲明:本文為 stormzhang 原創文章,可以隨意轉載,但必須在明確位置註明出處!!! 這篇博客背後的故事 一路走來很不容易,剛好知乎上被人邀請回答如何自學android編程, 就借

Python學習Day1passwd

col == import password print pre 判斷 day python 加密密碼: import getpassusername = input("username:")password = getpass.getpass("password:")pr

python學習Day1模塊初識

技術 執行 sys mage 需要 安裝 file com logs 模塊:寫好的代碼封裝好後可以直接調用 模塊可以叫做庫,分為標準庫和第三方庫 標準庫不需要安裝可以直接導入; 第三方庫需要安裝後才能導入; 標準庫:sys、os 第三方庫一般都安裝在C:\\Program

scala學習

項目 前綴 .org 特質 行為 java字節碼 java 類繼承 對象 所謂學習,那麽首先就先簡單介紹一下scala吧 1.scala的介紹 Scala 是一門多範式(multi-paradigm)的編程語言,設計初衷是要集成面向對象編程和函數式編程的各種特性。 S

.Net Core學習()

日常 整體 get res 頁面 image setting 文字 body   前言:因為公司轉型需要,特地學習.NET Core。本來在我的計劃中.Net Core的學習應該沒有快就被執行的。一來是我想多補一點基礎和理論知識,再者就是我想攢點錢買臺好點的電腦再裝VS2

視覺slam學習()看高翔十講所遇到的問題

nes make 機器 cmake 編寫 直接 記錄 nbsp slam 目前實驗室做機器人,主要分三個方向,定位導航,建圖,圖像識別,之前做的也是做了下Qt上位機,後面又弄紅外識別,因為這學期上課也沒怎麽花時間在項目,然後導師讓我們確定一個方向來,便於以後發論文什麽

Winfrom學習隨筆Log4net

閱讀 eventlog ger 內容 無法 man 數據庫 ttr 繼承體系 前提題要:因為我最近負責的Winfrom項目,好多都用到了這個log4net的日誌功能,開發程序對數據一般都要求做到雁過留痕,所以日誌對於我們程序員是不可或缺。因此我把對log4net的使用做一個

框架學習

學習工作當中用到了那麼多的框架,難免會想搞清楚這些框架的底層到底是怎樣實現的,藉此機會從簡單的寫起,嘗試著去實現一個框架   一,通過解析xml,獲取其中的欄位,用反射技術呼叫類中的方法   技術:dom4j,java反射 1,定義一個介面 package com.epro.f

Android流媒體開發:Camera2採集攝像頭原始資料並手動預覽

Android Camera2採集攝像頭原始資料並手動預覽 最近研究了一下android攝像頭開發相關的技術,也看了Google提供的Camera2Basic呼叫示例,以及網上一部分程式碼,但都是在TextureView等預覽基礎上實現,而我想要做的是在不預覽的情況下,能獲取到攝

OpenGL學習

第一篇部落格 QAQ 今天開始學OpenGL(好像之前學了點)有沒一起來搞的(滑稽) 求大佬帶飛 這裡分享個人的學習過程和心得(僅供參考)  如有不足之處望大家指出 =====================================================

Choerodon的微服務()如何邁出關鍵的第一步

本文是 Choerodon 豬齒魚微服務系列文章的第一篇,在文章中將介紹當前比較流行的兩種微服務架構,即 Dubbo 和 Spring Cloud,同時將總結 Choerodon豬齒魚在選擇使用微服務架構中的一些實踐經驗,希望能夠給大家一些借鑑和啟迪。 ▌文章的主要內容包括:

小程式學習開發工具部分功能和專案結構介紹

上一篇講到了新建專案進來,本篇主要講解開發工具部分功能和專案結構介紹,按照我的風格來,先上目錄 開發工具的部分功能簡介 小程式專案目錄簡介 以下幾個功能是我覺得比較方便喜歡的 自動儲存(設定----編輯設定-----選中修改檔案時自動儲存) console(控

【Nginx】學習 虛擬機器安裝

author:咔咔 wechat:fangkangfk   由於公司需求,得學Nginx了,下來就開始我學習Nginx的生涯   第一步那就是安裝虛擬機器了 這裡我就放一個百度網盤的地址,需要的加上面的微信要密碼 連結:https://pan.ba

TypeScript學習()

TypeScript語言內部主要被分為三層:語言層、編譯層、語言服務層。 每一個主要從層都有不同的用途:        語言層:實現所有TypeScript的語言特性。     &n

Git學習()-SSH公鑰配置

這篇文章是Git的學習之路的第一篇,學習Git是因為工作中需要重寫Activiti6.0原始碼,所以需要從Activiti GitHub官網下載相應資源,由於之前一直對Git的命令一知半解,所以打算趁著這個機會,好好學習一下Git相關知識。 一、從Git官網下載最新版本並在本地安裝 這一步就