Android學習系列之(五)Activity之間的資料傳遞

來源:互聯網
上載者:User

標籤:android   activity   intent   

前言:前面我們已經掌握了 Activity 的基本使用,但是那都是在同一個 Activity 中進行操作的。那麼若我們要在不同 Activity 之間進行資料互動,這又如何??那現在我們依舊以類比登入註冊這一個例子來進行說明

一、需求說明:    類比使用者的登入註冊行為,使用者註冊資訊後,將註冊時的帳號、密碼這一資料傳遞到登陸介面。二、代碼實現:1.布局檔案代碼:

  • activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <EditText        android:id="@+id/et_uname"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="@string/et_uname" />    <EditText        android:id="@+id/et_upass"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="@string/et_upass" />    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:onClick="login"            android:text="@string/bt_login" />        <Button            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:onClick="regist"            android:text="@string/bt_regist" />    </LinearLayout></LinearLayout>

  • activity_regist.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <EditText        android:id="@+id/et_uname"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="@string/et_uname" />    <EditText        android:id="@+id/et_upass"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="@string/et_upass" />    <Button        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="regist"        android:text="@string/bt_regist" /></LinearLayout>
2.java檔案代碼:
  • MainActivity.java:
public class MainActivity extends Activity {private EditText et_uname;private EditText et_upass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();}private void initViews() {et_uname = (EditText) findViewById(R.id.et_uname);et_upass = (EditText) findViewById(R.id.et_upass);}/** * 登入 * @param view */public void login(View view){String uname = et_uname.getText().toString().trim();String upass = et_upass.getText().toString().trim();if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){Toast.makeText(this, "使用者名稱密碼不可為空!", Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "登入成功!", Toast.LENGTH_SHORT).show();}}/** * 註冊 * @param view */public void regist(View view){Intent intent = new Intent(this, RegistActivity.class);int requestCode = 0;// 設定註冊操作的請求碼為 0startActivityForResult(intent, requestCode);}/** * 當新開啟的 Activity 被關閉時調用的方法: 在該函數內我們進行資料的處理 * 比如我們在此擷取從 RegistActivity 中返回的資料 */@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);System.out.println("onActivityResult...");if(data != null){if(requestCode == 0){String uname = data.getStringExtra("uname");String upass = data.getStringExtra("upass");et_uname.setText(uname);et_upass.setText(upass);}}}}
代碼註解:  1) login(View view)、regist(View view): 這是按鈕的點擊事件,關於按鈕點擊事件的寫法,請參考俺的另一篇博文:http://blog.csdn.net/gulu_gulu_jp/article/details/46876437  2) regist() 函數:因為需求的不同,我們若是依舊使用 startActivity(Intent intent) 這一 api 是不能滿足我們的需求的,我們需要使用新的 api,即 startActivityForResult(Intent intent, int requestCode).該 api 允許我們開啟一個 Activity,併當新開啟的 Activity 關閉時,接受新 Activity 傳遞的值  3) 請求碼(requestCode)的作用:主要用於區分操作的來源,若當前 Activity 中有兩個操作都要開啟一個新的 Activity 並擷取其返回值,那麼我們可以針對不同的操作設定不同的請求碼,在 onActivityResult 中根據請求碼來區分操作,進行相應業務的編碼  4) onActivityResult(): 我們可以在該函數中處理被開啟 Activity 返回的資料
  • RegistActivity.java:
public class RegistActivity extends Activity{private EditText et_uname;private EditText et_upass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_regist);initViews();}private void initViews() {et_uname = (EditText) findViewById(R.id.et_uname);et_upass = (EditText) findViewById(R.id.et_upass);}public void regist(View view){String uname = et_uname.getText().toString().trim();String upass = et_upass.getText().toString().trim();if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){Toast.makeText(this, "使用者名稱密碼不可為空!", Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "註冊成功!", Toast.LENGTH_SHORT).show();int resultCode = 0;// 返回碼:與請求碼類似,用於區分返回的結果(多條傳回值時)/* * 準備返回的資料:Intent 是可以傳遞資料的 */Intent data = new Intent();data.putExtra("uname", uname);data.putExtra("upass", upass);setResult(resultCode, data);// 返回結果finish();//  關閉當前 Activity:傳遞資料給當前 Activity 的調用者,調用者將執行 onActivityResult 方法}}}
3.運行結果:
三、代碼實現的第二種方法:Intent 的靈活使用回顧一下剛剛的代碼,想想我們是怎麼來完成需求的:  1) 布局檔案的編寫  2) MainActivity:使用startActivityForResult() 來開啟 RegistActivity,並重寫 onActivityResult() 方法  3) RegistActivity: 使用 Intent 儲存返回的資料,並調用setResult(int resultCode, Intent data) 返回結果經此三步,即可完成需求。那麼,除了這一種方法外,我們能不能有其他的方法來實現呢?答案是:offcourse,靈活使用 Intent 就行代碼實現:布局檔案不變
  • MainActivity.java:
public class MainActivity extends Activity {private EditText et_uname;private EditText et_upass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();}private void initViews() {et_uname = (EditText) findViewById(R.id.et_uname);et_upass = (EditText) findViewById(R.id.et_upass);Intent data = getIntent();// 擷取 Intentif(data != null){String uname = data.getStringExtra("uname");String upass = data.getStringExtra("upass");et_uname.setText(uname);et_upass.setText(upass);}}/** * 登入 * @param view */public void login(View view){String uname = et_uname.getText().toString().trim();String upass = et_upass.getText().toString().trim();if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){Toast.makeText(this, "使用者名稱密碼不可為空!", Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "登入成功!", Toast.LENGTH_SHORT).show();}}/** * 註冊 * @param view */public void regist(View view){Intent intent = new Intent(this, RegistActivity.class);startActivity(intent);finish();}}
  • RegistActivity.java:
public class RegistActivity extends Activity{private EditText et_uname;private EditText et_upass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_regist);initViews();}private void initViews() {et_uname = (EditText) findViewById(R.id.et_uname);et_upass = (EditText) findViewById(R.id.et_upass);}public void regist(View view){String uname = et_uname.getText().toString().trim();String upass = et_upass.getText().toString().trim();if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){Toast.makeText(this, "使用者名稱密碼不可為空!", Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "註冊成功!", Toast.LENGTH_SHORT).show();// 使用 Intent 儲存資料Intent data = new Intent(this, MainActivity.class);data.putExtra("uname", uname);data.putExtra("upass", upass);startActivity(data);finish();}}}
代碼編輯完畢,我們運行測試一下,發現運行結果和上面的一模一樣。很好,那麼這種實現方法也通過了,需求完成,Congratulation!

著作權聲明:部落格編寫不易,轉載時請註明出處,Thank you very much!

Android學習系列之(五)Activity之間的資料傳遞

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.