安卓活動間的傳值問題

一、向下一個活動傳遞數據java

     Intent中提供了一系列的putExtra()方法的重載,能夠把咱們想要傳的數據暫存在Intent中,啓動一個活動後,只需把這些數據在從Intent中,取出來便可。作一個簡單的Demo演示一下:android

新建項目MyDataTrans,同時在項目中新建類Second.java和佈局second.xml。ide

在activity_main.xml中修改佈局(TextView用於獲取從上一活動或許的值):佈局

<LinearLayout 
        android:id="@+id/lin1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        
        <Button 
            android:id="@+id/btn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Click On"/>
        
       
    </LinearLayout>
    <LinearLayout
        android:id="@+id/line2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/lin1" 
        >
          <TextView 
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    </LinearLayout>
activity_main.xml

在second.xml中修改佈局(TextView用於獲取從上一活動或許的值):this

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <Button 
        android:id="@+id/btn2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Back"/>
</LinearLayout>
second.xml

在MainActivity.java中添加按鈕1的單擊事件,跳轉到活動2中,spa

btn1=(Button)findViewById(R.id.btn);        
        btn1.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent1=new Intent(MainActivity.this,Second.class);
                intent1.putExtra("mydata", "你好,我來自界面1。。。。");
                startActivity(intent1);
            }
        });
setOnClickListener()

這裏咱們用顯示Intent的方式啓動Second,並經過putExtra()方法傳遞一個字符串。其中putExtra()接受兩個參數,第一個參數是鍵,用於後面從Intent中取值,第二個參數就是要傳遞的值。
接着進入到Second.java中,在這裏咱們的目的就是要把上一個頁面傳的值進行取出顯示,onCreat()方法中添加以下代碼:code

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        btn2=(Button)findViewById(R.id.btn2);
        textView2=(TextView)findViewById(R.id.textView2);
        
        //獲取上一個活動傳出的值
        Intent intent=getIntent();
        textView2.setText(intent.getStringExtra("mydata"));
}
onCreat()

經過getIntent()方法獲取用於啓動的Second的Intent,而後調用getStringExtra()方法,獲取相應的鍵值,就能夠獲得傳遞的數據了。而後把傳遞的數據在TextView上顯示出來。xml

二、返回數據給上一個活動blog

方法其實和上面的相似,在MainActivity.java中 依舊是點擊Button控件跳轉到Second頁面,事件

Intent intent1=new Intent(MainActivity.this,Second.class);   startActivityForResult(intent1, 1);

這裏咱們用startActivityForResult()方法來啓動Second,startActivityForResult()方法接受兩個參數,第一個參數是Intent,第二個參數是請求碼,用於在回調中判斷數據的來源。其中,請求碼只要是惟一值就能夠了。

在Second中給按鈕註冊點擊事件,並添加返回數據的邏輯:

btn2=(Button)findViewById(R.id.btn2);
btn2.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                Intent intentback=new Intent();
                intentback.putExtra("data_back", "界面1,你好!!!");
                setResult(RESULT_OK, intentback);
                finish();
            }
        });
View Code

這裏構建Intent僅僅用於傳遞數據而已,沒有任何指定的意圖。緊接着要傳遞的數據放在intentback中,而後調用setResult()方法,用於向上一個活動返回數據。setResult()方法接受兩個參數,第一個參數用於向上一個活動返回處理結果,通常只有RESULT_OK或者RESULT_CANCELED這兩個值,第二個參數則是把帶有數據的intentback傳遞回去,而後調用finish()方法來銷燬當前活動(必須銷燬,不然沒法回調)。

因爲使用startActivityForResult()方法啓動的Second,因此在被銷燬以後會回調到上一個活動的onActivityResult()方法,所以須要在MainActivity.java中從新寫這個方法來獲得返回的數據,以下所示:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        textView1=(TextView)findViewById(R.id.textView1);
        super.onActivityResult(requestCode, resultCode, data);
        switch(requestCode){
        case 1:
            if(resultCode==RESULT_OK){
                textView1.setText(data.getStringExtra("data_back")+"我來自界面2!!!");
            }
            break;
            default:
        }
                
    }
onActivityResult()

onActivityResult()有三個參數,第一個參數requestCode,即咱們在啓動活動時傳入的請求碼,第二個參數resultCode,即咱們在返回出具時傳入的處理結果,第三個參數data即咱們帶有返回數據的Intent(這裏指intentback)。

因爲一個活動中有可能調用startActivityForResult()方法去啓動不少不一樣的活動,可是每個活動返回的數據都會調到onActivityResult()中,因此首先要作的就是根據requestCode,即請求碼來檢查判斷數據源。而後再根據resultCode的值來判斷處理結果是否成功。最後有打他來傳入返回的數據。

答疑:當用戶不是經過按鈕的單擊事件返回,而經過back鍵返回時是否是就無法獲取想要返回的數據了呢?

這時候只需咱們調用一個叫作onBackPressed()的方法來解決這個問題。代碼以下:

public void onBackPressed() {
        Intent intentback=new Intent();
        intentback.putExtra("data_back", "界面1,你好!!!");
        setResult(RESULT_OK, intentback);
        finish();
    }
onBackPressed()

其實,咱們能夠 單獨寫一個返回數據的方法,而後在按鈕註冊點擊事件或者onBackPressed()時直接調用就好。

相關文章
相關標籤/搜索