多視窗資料傳遞
意圖(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