多視窗資料傳遞.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
1 實驗十二:待辦事項程式 ( 儲存在遠端伺服器上 ). 實驗十二 2  主題  本實驗為練習使用 Web Service 操作資料庫  使用資料庫用來建立、新增、刪除、修改資料等功能  目的  學習如何使用 Web Service 的連線  了解與遠端伺服器的參數傳遞  環境需求 
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.
類別與物件 Class & Object.
Activity之间的数据传递.
Android + Web Service 建國科技大學 資管系 饒瑞佶 2017/3 V1.
ArrayAdapter & Spinner
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
實驗四:單位轉換程式.
第7章 Android文件与本地数据库(SQLite)
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
實驗十三:顯示目前經緯度位置.
其他視窗.
Ch06 再談選單元件 物件導向系統實務.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
使用Android控制Arduino 史先强
7.3 Intent传值.
Android开发入门 -----Activity的一生 主讲:何广军
Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
JAVA 程式設計與資料結構 第六章 輸出與輸入.
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Chapter 6 進階UI設計.
第9章 使用意圖啟動活動與內建應用程式 9-1 意圖的基礎 9-2 使用意圖啟動活動
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
Android 基礎.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
實驗十四:顯示與控制地圖.
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
手機的頁面轉換與資料傳遞.
Location Based Services - LBS
Android 專案建立、編譯與執行.
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
生活智慧王 樹德科技大學 資訊工程系 指導教授 : 陳毓璋 教授 小組成員: 劉上緯 翁維廷 洪文財.
第一單元 建立java 程式.
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
Chapter 5 Basic UI Design.
實驗九:延續實驗八, 製作一個完整音樂播放器
Location Based Services - LBS
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
GUI Title and GUI Status
GridView.
陣列與結構.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
RecyclerView and CardView
實驗十:影片播放.
Android Speech To Text(STT)
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
用Intent啟動程式中的其他Activity、運用WebView顯示網頁 靜宜大學資管系 楊子青
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
加速感測器 靜宜大學資管系 楊子青.
SQLite資料庫 靜宜大學資管系 楊子青.
Part 8 Broadcast Receiver、Service和App Widget
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

多視窗資料傳遞

意圖(Intent) 首先介紹意圖(Intent)

意圖(Intent) 意圖類別是當一個活動要開啟另一個活動時,用來描述欲開啟的活動 開啟活動時可以在意圖中存放資料或包裹(Bundle)物件 意圖的用意是用來描述開啟哪個活動,以及開啟活動時將資料傳遞進去 利用意圖傳遞資料時,可以放入多個資料,也可以放入一個包裹(Bundle)物件 一個包裹可以存放多個資料,後面的投影片會介紹 http://developer.android.com/reference/android/content/Intent.html

意圖類別 Intent putExtra (String name, Var value) 當活動傳遞時可以將參數value傳遞到下一個活動,name為索引值,做為取值時使用 Var為變數型別,可以是:boolean、double、int、CharSequence、char、Bundle、float、byte、String……等 如Intent putExtra (String name, String value) Var getVarExtra (String name) 利用name索引值取得活動開啟時接收Intent內傳遞的資料 Var為各種型別名稱(開頭大寫) 如String getStringExtra(String name) 使用意圖將資料存入的方法為putExtra(),方法有兩個引數,name作為索引值,value為資料,其中Var代表的是各種變數型別,可以是boolean、double、int、CharSequence、char、Bundle、float、byte、String……等 使用意圖取得資料的方法為getVarExtra(),方法的引數為索引值,用來對應putExtra()時放入的索引,其中Var代表各種資料型別名稱(開頭大寫),如getStringExtra("name"); http://developer.android.com/reference/android/content/Intent.html

意圖類別方法 Intent putExtras (Bundle extras) Bundle getExtras () Intent setClass (Context packageContext, Class<?> cls) 描述要開啟位於packageContext的封裝中的cls類別 若在活動中呼叫此方法欲開啟同一個封裝中的活動,通常寫法為:intent.setClass(this, Activityname.class) 使用意圖開啟活動時呼叫setClass()方法 方法有兩個參數,packageContext是要開啟的活動封裝描述,cls是要開啟的活動類別 通常呼叫寫法 intent.setClass(this, Activityname.class) http://developer.android.com/reference/android/content/Intent.html

包裹(Bundle)

包裹(Bundle) 一個包裹(Bundle)可以放入多個資料 意圖在傳遞資料時可以直接傳遞一個包裹 使用意圖傳遞資料時可以直接將一個包裹存入並傳遞至下一活動 http://developer.android.com/reference/android/os/Bundle.html

包裹類別方法 void putVar (String key, Var value) Var getVar (String key) 放入value參數到包裹中,key為索引值 Var為變數型別,可以是boolean、double、int、CharSequence、char、 Bundle、float、byte、String……等 如void putInt(String key, int value) Var getVar (String key) 取得包裹中索引值為key的資料 Var為資料型別,如int getInt(String key) 將資料存入包裹的方法為putVar(),方法有兩個引數,key為索引值,value為要存入的資料,其中Var為變數型別,如putInt(key, value) 從包裹中取得資料的方法為getVar(),方法引數為索引值,索引值對應到puVar時存入的值,其中Var為變數型別,如getInt(key) http://developer.android.com/reference/android/os/Bundle.html

Bundle使用範例 產生一個Bundle void putInt(String key, int value) Ex: Bundle bdl=new Bundle(); void putInt(String key, int value) key可以任意命名 將對應key的資料放入 Ex: bdl.putInt("height", 20); void putIntArray(String key, int[] value) 將對應key的整數陣列資料放入 Ex: int [] values={20,30,40}; bdl.putIntArray("data",values); key value height 20 data {20,30,40}

Bundle使用範例 int getInt(String key) Ex: int a=bdl.getInt("height"); int getInt(String key, int defaultValue) 取出對應key中的整數型態資料,若取不到資料就以defaultValue為其值 Ex: int a=bdl.getInt("width",30); int[ ] getIntArray(String key) 取出對應key中的整數陣列型態資料 int [] b; b=bdl.getIntArray("data"); a=20; a=30; key value height 20 data {20,30,40}

開啟活動

活動類別中開啟活動的方法 void startActivity (Intent intent) 從活動中要開啟另一個活動有兩個方法, 1.使用startActivity()方法只需傳入意圖,呼叫後會開啟另一個活動並將意圖傳入 http://developer.android.com/reference/android/app/Activity.html

啟動另一個Activity Step 1. 製作另一個Activity (SecondActivity.java) Step 2. 在AndroidManifest.xml檔案中,加入要開啟的另一個Activity <activity android:name="SecondActivity"></activity> Step 3.在第一個Activity (MainActivity.java)中,開啟第二個Activity Intent i= new Intent(); Bundle bdl = new Bundle(); bdl.putDouble("height", 20); bdl.putString("data", "abc"); i.putExtras(bdl); i.setClass(this, SecondActivity.class); startActivity(i); MainActivity.java SecondActivity.java startActivity() data data

活動類別中開啟活動的方法 void startActivityForResult (Intent intent, int requestCode) 開啟intent描述的活動,並且等待被開啟的活動回傳資料 呼叫時傳入一個requestCode作為索引,用來識別開啟的活動 從活動中要開啟另一個活動有兩個方法, 2.使用startActivityForResult()方法需要傳入意圖與一個requestCode,這個requestCode是用來識別開啟哪個活動,當被開啟的活動回傳資料時也會將requestCode傳回 http://developer.android.com/reference/android/app/Activity.html

被開啟的活動回傳資料 當活動是由startActivityForResult()開啟時,可以利用以下方法回傳結果給上一個活動 void setResult (int resultCode) void setResult (int resultCode,Intent data) resultCode是回傳結果識別碼,data為回傳的意圖,可以放入資料至此意圖中再傳遞回發出開啟的活動 被開啟的活動呼叫setResult()方法將資料回傳給發出開啟活動意圖的活動 方法參數可以只有一個,為回傳結果,發出開啟的活動可以利用這個回傳結果的值做不同處理 方法若傳入兩個參數,則其一為回傳結果,另一個為意圖,可以放入資料至此意圖中再傳遞回發出開啟的活動 http://developer.android.com/reference/android/app/Activity.html

接收被開啟活動回傳的資料 若呼叫startActivityForResult()方法開啟活動後,必須覆寫onActivityResult()方法待被開啟的活動回傳後執行 void onActivityResult (int requestCode, int resultCode, Intent data) 利用requestCode識別由哪個活動的發出的回傳,resultCode是從被開啟的活動回傳的識別碼,用來辨識回傳結果,data則是回傳的意圖,可以利用此意圖取得被開啟的活動回傳的資料 呼叫startActivityForResult()方法後,必須覆寫onActivityResult()方法來取得活動回傳結果 方法有三個引數,其一是requestCode,為呼叫startActivityForResult()方法時傳入的參數,其二是回傳結果,可以利用這個結果做不同的處裡, 最後一個為意圖,可以利用此意圖取得被開啟的活動回傳的資料 http://developer.android.com/reference/android/app/Activity.html

雙向傳遞資料 MainActivity.java SecondActivity.java setResult( ) startActivityForResult() data data setResult( ) data onActivityResult() { } data

範例(MultiActivities)

建立第二個活動方式 在MultiActivities專案上按滑鼠右鍵 選擇其他 1 2 首先先建立一專案,在專案上加入第二個活動 2.選擇其他 選擇其他

建立第二個活動方式 選擇Android Activity,加入一個活動 3 4 在新建精靈中 4.下一步 4

建立第二個活動方式 填入活動名稱 自動產生的佈局 6 7 5 5. 新增活動視窗,不需更改設定,直接按下下一步 6. 設定活動名稱為SeondActivity,Layout Name會自動產生 7.下一步 7 5

建立第二個活動方式 精靈會顯示加入活動時會自動修改的程式和內容 8.完成 8

res/layout/avtivity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="傳遞數值" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="numberDecimal" > <requestFocus /> </EditText> <TextView android:id="@+id/textView2" android:text="傳遞字串" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/editText2" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" /> <Button android:id="@+id/button1" android:text="StartActivity方法" /> <Button android:id="@+id/button2" android:text="StartActivityForResult方法" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="回傳資料" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" </LinearLayout> res/layout/activity_main.xml內容 包含兩個EditText作為輸入資料並且傳遞至下一個活動 兩個按鈕分別對應startActivity()方法及startActivityForResult()方法

src/MainActivity.java 設定按鈕onClick事件 取出EditText輸入資料、初始化包裹,並放入資料 public class MainActivity extends Activity implements OnClickListener { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn1=(Button)findViewById(R.id.button1); btn1.setOnClickListener(this); Button btn2=(Button)findViewById(R.id.button2); btn2.setOnClickListener(this); } public void onClick(View arg0) { EditText et1=(EditText)findViewById(R.id.editText1); EditText et2=(EditText)findViewById(R.id.editText2); Bundle b=new Bundle(); b.putDouble("numData", Double.parseDouble(et1.getText()+"")); b.putString("strData", et2.getText()+""); Intent intent=new Intent(); intent.setClass(this, SecondActivity.class); intent.putExtras(b); switch (arg0.getId()) { case R.id.button1: startActivity(intent); break; case R.id.button2: startActivityForResult(intent, 111); } //接下頁 設定按鈕onClick事件 取出EditText輸入資料、初始化包裹,並放入資料 初始化意圖,設定要開啟SecondActivity活動視窗,將包裹放入意圖中 按下StartActivity方法按鈕,開啟SecondActivity活動視窗 按下startActivityForResult方法按鈕,開啟SecondActivity活動視窗

src/MainActivity.java 覆寫onActivityResult()方法,處理活動的回傳 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==111 && resultCode==Activity.RESULT_OK) { TextView tv=(TextView)findViewById(R.id.textView4); if(data!=null) String str=data.getStringExtra("returnStr"); if(str!=null) tv.setText(str); } super.onActivityResult(requestCode, resultCode, data); 檢查requestCode是否為StartActivityForResult()傳入的值,及resultCode是否為Activity.RESULT_OK 若正確將EditText更改為Intent中索引為“returnStr”的字串 覆寫onActivityResult()方法 先判斷回傳碼與回傳結果是否相符,若符合則將EditText中的文字更改為意圖中索引為"returnStr"的字串

res/layout/avtivity_second.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".SecondActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="接收到的數值" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="接收到的字串" <TextView android:id="@+id/textView4" android:layout_width="wrap_content" <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="回傳資料" <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回" /> </LinearLayout> res/layout/avtivity_second.xml內容 1. 放入5個TextView,兩個用來顯示從意圖中取得包裹後從包裹中取出的文字字串 2. 放入一個EditText,用來回傳資料 3. 放入一個按鈕,作為回傳資料並且關閉活動

src/SecondActivity.java 設定監聽按鈕onClick事件 public class SecondActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button btn1=(Button)findViewById(R.id.button1); btn1.setOnClickListener(this); Intent intent=getIntent(); Bundle b=intent.getExtras(); if(b!=null) { double num=intent.getDoubleExtra("numData", 0); String str=intent.getStringExtra("strData"); TextView tv1=(TextView)findViewById(R.id.textView2); tv1.setText(num+""); TextView tv2=(TextView)findViewById(R.id.textView4); if(str!=null) tv2.setText(str); } public void onClick(View v) { EditText ed=(EditText)findViewById(R.id.editText1); Intent intent = new Intent(); intent.putExtra("returnStr", ed.getText()+""); setResult(Activity.RESULT_OK, intent); finish(); 設定監聽按鈕onClick事件 呼叫getIntent()方法取得意圖,再呼叫getExtras()方法取得包裹 從包裹中取得索引為“numData”的數值和索引為“strData”的字串,並顯示在TextView中 處理按鈕onClick事件,取得EditText中輸入的文字,放入意圖,並後呼叫setResult()方法回傳

Q & A