Android 組件系列-----Activity的傳值和回傳值

在這篇隨筆裏將講解Activity的傳值和回傳值。android

1、經過startActivity來進行Activity的傳值app

在Android中,若是咱們要經過一個Activity來啓動另外一個Activity,可使用 startActivity(Intent intent)方法來傳入一個Intent對象,這個Intent對象咱們能夠精確的指定咱們須要跳轉的Activity上,或者經過Intent對象來指定咱們要完成的一個action操做。ide

①.經過setClass方法來指定咱們要跳轉的Activitythis

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);

②.經過setAction方法來咱們要完成的一個action操做spa

Intent  intent = new Intent();
intent.setAction("com.xiaoluo.android_intent.second");

經過這種方式能夠來指定咱們的Intent對象要完成某個操做,這個操做能夠是啓動一個Activity,咱們能夠在AndroidManifest.xml中在 <Activity> 元素下指定一個 <intent-filter> 對象,而後其子元素聲明一個 <action> 元素,這樣咱們能夠將這個action動做綁定到了這個Activity上,即Android操做系統會去找與intent對象中指定的action名字的 <intent-filter>對象,而後執行相應的動做,例如:操作系統

     <activity 
            android:name="com.xiaoluo.android_intent.SecondActivity"
            android:label="SecondActivity">
            <intent-filter>
                <action android:name="com.xiaoluo.android_intent.second"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

這樣咱們的Intent對象,在啓動時,就會找到名字爲 com.xiaoluo.android_intent.second 的<intent-filter>對象,來啓動咱們的SecondActivity。code

咱們來看看如何在Activity對象中進行值的傳遞,也是經過 Intent 對象的各類putExtra方法來進行傳遞:xml

MainActivity:對象

public class MainActivity extends Activity
{
    private Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new ButtonListener());
    }

    class ButtonListener implements OnClickListener
    {
        @Override
        public void onClick(View v)
        {
//            Intent intent = new Intent();
//            intent.setClass(MainActivity.this, SecondActivity.class);
            Intent  intent = new Intent();
            intent.setAction("com.xiaoluo.android_intent.second");
            
            intent.putExtra("com.xiaoluo.android_intent.age", 20); // 第一個參數指定name,android規範是以包名+變量名來命名,後面是各類類型的數據類型
            intent.putExtra("com.xiaoluo.android_intent.name", "xiaoluo");
            
            Bundle bundle = new Bundle();  //  Bundle的底層是一個HashMap<String, Object
            bundle.putString("hello", "world");
            intent.putExtra("bundle", bundle);
            
            startActivity(intent);
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

SecondActivity:blog

public class SecondActivity extends Activity
{
    private TextView textView;
    private final String TAG = "SecondActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        
        textView = (TextView)findViewById(R.id.textView);
        
        //    獲得跳轉到該Activity的Intent對象
        Intent intent = getIntent();
        
        int age = intent.getIntExtra("com.xiaoluo.android_intent.age", 10);
        String name = intent.getStringExtra("com.xiaoluo.android_intent.name");
        Bundle bundle = intent.getBundleExtra("bundle");
        String world = bundle.getString("hello");
        
        Log.i(TAG, age + ", " + name + ", " + world);
         
        textView.setText(name + " : " + age + ", " + world);
        
        System.out.println(intent);
    }
}

在第二個Activity對象中,能夠經過 getIntent() 方法來獲得跳轉到這個Activity的Intent對象,而後經過 Intent 對象的各類 getXXExtra 方法來獲得咱們的傳過來的值。

AndroidManifest.xml文件以下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xiaoluo.android_intent"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xiaoluo.android_intent.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity 
            android:name="com.xiaoluo.android_intent.SecondActivity"
            android:label="SecondActivity">
            <intent-filter>
                <action android:name="com.xiaoluo.android_intent.second"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

這樣咱們就能夠實現Activity直接的值的傳遞。

2、經過startActivityForResult方法來獲得Activity的回傳值

在一些狀況下,咱們經過 A activity跳轉到 B activity上,這時但願 A activtiy能從 B activity上獲得一些返回值,這個時候咱們就不能使用startActivity方法了,而是使用 startActivityForResult方法來完成咱們的操做。

例如,咱們但願完成下面一個功能,在MainActivity上,寫上一個算術表達式,而後跳轉到到第二個SecondActivity上,在這個Activity上將第一個Activity的表達式顯示出來,而後咱們能夠輸入咱們的算術表達式結果,而後點擊按鈕,將這個結果值又返回給咱們的MainActivity,並將結果填充到算術表達式中,具體看以下代碼:

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="70dp"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/editText1"
        android:text=" + "
        android:textSize="30sp" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textView1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/editText2"
        android:text=" = "
        android:textSize="30sp" />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textView2" />
    
    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/editText3"
        android:layout_centerInParent="true"
        android:layout_marginTop="30dp"
        android:text="跳轉到SecondActivity"/>

</RelativeLayout>

second.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <TextView
        android:id="@+id/textView1"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    
    <EditText 
        android:id="@+id/editText1"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textView1"/>
    
    <Button 
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/editText1"
        android:text="返回給MainActivity"/>
    
</RelativeLayout>

而後咱們來看看兩個Activity

MainActivity:

public class MainActivity extends Activity
{
    private Button button;
    private EditText editText1;
    private EditText editText2;
    private EditText editText3;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.button);
        editText1 = (EditText)findViewById(R.id.editText1);
        editText2 = (EditText)findViewById(R.id.editText2);
        editText3 = (EditText)findViewById(R.id.editText3);
        
        button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.putExtra("message", editText1.getText().toString().trim() + " + " + editText2.getText().toString().trim() + " = ?");
                intent.setClass(MainActivity.this, SecondActivity.class);
                /*
                 * 若是但願啓動另外一個Activity,而且但願有返回值,則須要使用startActivityForResult這個方法,
                 * 第一個參數是Intent對象,第二個參數是一個requestCode值,若是有多個按鈕都要啓動Activity,則requestCode標誌着每一個按鈕所啓動的Activity
                 */
                startActivityForResult(intent, 1000);
            }
        });
    }
    
    /**
     * 全部的Activity對象的返回值都是由這個方法來接收
     * requestCode:    表示的是啓動一個Activity時傳過去的requestCode值
     * resultCode:表示的是啓動後的Activity回傳值時的resultCode值
     * data:表示的是啓動後的Activity回傳過來的Intent對象
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1000 && resultCode == 1001)
        {
            String result_value = data.getStringExtra("result");
            editText3.setText(result_value);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

咱們看到,這裏咱們使用的是 startActivityForResult 的這個方法,

public void startActivityForResult (Intent intent, int requestCode)

Same as calling startActivityForResult(Intent, int, Bundle) with no options.

Parameters
intent    The intent to start.
requestCode    If >= 0, this code will be returned in onActivityResult() when the activity exits.
Throws   android.content.ActivityNotFoundException

第一個指定咱們的Intent對象,第二個requestCode指定咱們的一個啓動標誌值,由於咱們可能有多個按鈕,若是都是跳轉到同一個Activity對象上,咱們須要對其進行標誌,才知道是哪一個Activity對象跳轉過來的。

咱們看到這裏還有一個 onActivityResult 方法,這個方法就是用來處理咱們Activity的回傳值的方法,全部的Activity回傳值的操做都是在這個方法中完成。

protected void onActivityResult (int requestCode, int resultCode, Intent data)

Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation.

You will receive this call immediately before onResume() when your activity is re-starting.

Parameters
requestCode    The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.
resultCode    The integer result code returned by the child activity through its setResult().
data    An Intent, which can return result data to the caller (various data can be attached to Intent "extras").

接下來,咱們看看SecondActivity這個類:

public class SecondActivity extends Activity
{
    private Button button;
    private TextView textView;
    private EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        
        button = (Button)findViewById(R.id.button1);
        textView = (TextView)findViewById(R.id.textView1);
        editText = (EditText)findViewById(R.id.editText1);
        
        Intent intent = getIntent();
        String message = intent.getStringExtra("message").toString().trim();
        textView.setText(message);
        
        button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                String result = editText.getText().toString().trim();
                Intent intent = new Intent();
                intent.putExtra("result", result);
                /*
                 * 調用setResult方法表示我將Intent對象返回給以前的那個Activity,這樣就能夠在onActivityResult方法中獲得Intent對象,
                 */
                setResult(1001, intent);
                //    結束當前這個Activity對象的生命
                finish();
            }
        });
    }
}

這個類裏面咱們將MainActivity傳過來的值給TextView賦上,而後經過點擊按鈕將值回傳給咱們的 MainActivity,經過 setResult 方法能夠將咱們的值保存在Intent對象中,並返回給MainActivity對象,經過的 onActivityResult 方法來處理獲得的回傳Intent對象。finish()方法咱們能夠顯示的結束這個Activity對象的生命。

最後咱們來看一下AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xiaoluo.android_activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xiaoluo.android_activity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.xiaoluo.android_activity.SecondActivity"
            android:label="SecondActivity" >
        </activity></application>

</manifest>

咱們來看看效果圖:

相關文章
相關標籤/搜索