android 之Activity的五种传值方式 (在从当前Activity跳转到目标Activity时的传值方式)
A.使用intent(意圖)傳值
MainActivity(源文件):
? ? ? ? 1.intent.putExtra(key,value):key一般是String,值為 java八大基本數據類型及對應的數組,String及對應的數組, Serializable 及對應的數組等
? ? ? ? 2.intent.putExtras(bundle);
? ? ? ? 3.intent.putExtra(key,bundle)
DetailActivity(目標文件):
? ? ? ? 1.intent.getXXXExtra(key)獲取值
? ? ? ? 2.bundle=intent.getExtras()
? ? ? ? 3.bundle=intent.getExtras(key)
B.使用Application全局對象傳值
1.自定義一個類MyApp繼承Application 并重寫它的onCreate()方法,將需要傳遞的值以成員變量的方式定義在MyApp 類中并提供getter和setter函數
2.在功能清單文件中指定自定義的全局應用程序application節點中指定android:name=".MyApp"
3.在MainActivity 中得到自定義的Appllication類型的子類對象MyApp類型的對象
? ? ? ? MyApp myApp=(MyApp)this.getApplication();? ? ? ? myApp.setName("xxx");
? ? ? ? myApp.setAge(20)
? ? ? ? myApp.setDog(dog);
4.在詳情Activity 中得到全局應用程序對象
?? ? ? ?MyApp myApp=(MyApp)this.getApplication();
? ? ? ? xxx=myApp.getName()? ? ? ? age=myApp.getAge()
? ? ? ? dog=myApp.getDog()
C.使用startActivityForResult()傳值 ==》(反向傳值)
1.使用startActivityForResult(intent,requestCode(大于等于0))方法激活目標Activity
2.在目標Activity 中調用setResult(resultCode,intent) 設置回傳到源Activity 的結果碼和意圖對象
3.在源Activity 中重寫onActivityResult(requestCode,resultCode,intent)方法得到目標Activity 回傳的數據
這兩種方法的用法:
1.區別
StartActivityForResult:是說明調用這個activity,關閉后可以接收到返回值
OnActivityForResult:當activity關閉后,如果有返回值,則會在這個方法內接收
2.聯系
這兩者是配對使用的,一個是告訴對方有接收值,一個是接收對方的返回值
反向結構傳值示意圖
請求碼與作用碼示意圖
示例代碼:
DetailActivity.Java:
package com.example.tf.reversetransmission;import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText;public class DetailActivity extends AppCompatActivity {private EditText editText_name;private EditText editText_age;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.detail_main);this.editText_age = (EditText) this.findViewById(R.id.editText_age);this.editText_name = (EditText) this.findViewById(R.id.editText_name);}public void ok(View view){String name = this.editText_name.getText().toString().trim();String age = this.editText_age.getText().toString().trim();Intent data = new Intent();data.putExtra("name",name);data.putExtra("age",Integer.parseInt(age));//設置結果碼和意圖對象,會將這些值在當前Activity銷毀后返回到激活當前Activity的Activity(MainActivity)中this.setResult(RESULT_OK,data);//銷毀當前Activitythis.finish();}/*** 當用戶按手機上的返回鍵時自動調用的方法*/@Overridepublic void finish(){String name = this.editText_age.getText().toString().trim();String age = this.editText_name.getText().toString().trim();Intent data = new Intent();data.putExtra("name",name);data.putExtra("age",Integer.parseInt(age));//同上this.setResult(RESULT_OK,data);//銷毀當前Activity必須放到最后super.finish();} }detail.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"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPersonName"android:hint="請輸入你的姓名"android:ems="10"android:id="@+id/editText_name"android:layout_gravity="center_horizontal" /><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="number"android:hint="請輸入你的年齡"android:ems="10"android:id="@+id/editText_age" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="確定"android:onClick="ok"android:layout_gravity="center_horizontal" /></LinearLayout>MainActivity.java
package com.example.tf.reversetransmission;import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View;public class MainActivity extends AppCompatActivity {/*** 自定義請求碼常量,值不能是1*/private static final int REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*** @parm view*/public void openDetail(View view ){Intent intent = new Intent(this,DetailActivity.class);startActivityForResult(intent,REQUEST_CODE);}//protected void onActivityResult(int requestCode,int resultCode,Intent data){//if(requestCode==REQUEST_CODE){if(requestCode==RESULT_OK){String name = data.getStringExtra("name");int age = data.getIntExtra("age",0);System.out.println("onActivityResult().name="+name+",age="+age);}}System.out.println("======MainActivity.onActivityResult(int requestCode="+requestCode+", int resultCode="+resultCode+", Intent data="+data+")======");} }activity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="openDetail"android:text="以完全覆蓋的形式啟動詳情Activity"android:layout_gravity="center_horizontal"/> </LinearLayout>注意:不能忘記在功能清單文件上注冊DetailActivity。
D.傳遞自定義類型的對象,實現Serializable 接口或者Parcelable 接口
?MainActivity中設置值:intent.putExtra(key,dog)
?DetailActivity 中獲取值:Dog dog=(Dog)intent.getSerializableExtra(key)
E.全局靜態變量傳值
1.自定義全局靜態變量類ContextData
2.在MainActivity中設置需要傳遞的值
? ? ? ? ContextData.setXXX(xxx);
3.在詳情Activity 中獲取值即可
? ? ? ? XXX=ContextData.getXXX()
總結
以上是生活随笔為你收集整理的android 之Activity的五种传值方式 (在从当前Activity跳转到目标Activity时的传值方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 之intent(意图)
- 下一篇: 卖自己的房子只有身份证和房产证可以吗