1. 程式人生 > >Android多個Activity之間的頁面跳轉帶參傳遞與返回

Android多個Activity之間的頁面跳轉帶參傳遞與返回

一.普通頁面跳轉

Activity之間進行跳轉需要使用Intent類 Intent 意圖

第一個Activity

    <Button
        android:id="@+id/btn_open"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="開啟新的Activity" />

    <TextView
        android:id="@+id/tv_first"
        android:gravity="center"
        android:text="第一個Activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


第二個Activity

    <Button
        android:id="@+id/btn_back"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="返回第一個Activity" />

    <TextView
        android:id="@+id/tv_second"
        android:gravity="center"
        android:text="第二個Activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


第一個Activity的按鈕點選事件

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_first);
		
		Button btn_open = (Button) findViewById(R.id.btn_open);
		
		btn_open.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//建立一個意圖,引數為(當前的Activity類物件,需要開的的Activity類)
				Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
				//啟動意圖
				startActivity(intent);
			}
		});
	}
最後別忘記了在AndroidManifest.xml檔案中註冊Activity
       <activity android:name=".SecondActivity" >
養成習慣,在每次建立新的Activity時,就及時去AndroidManifest.xml註冊 二.Activity帶參跳轉
帶參跳轉則需要使用 Intent 的 putExtra(鍵,值)方法來放入引數,然後在第二個Activity中使用 getIntent().get型別Extra(鍵)來取得值 第一個Activity按鈕的點選事件 只比前面多了一行程式碼  intent.putExtra("key", "我是引數");
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_first);
		
		Button btn_open = (Button) findViewById(R.id.btn_open);
		
		btn_open.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//建立一個意圖,引數為(當前的Activity類物件,需要開的的Activity類)
				Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
				intent.putExtra("key", "我是引數");
				//啟動意圖
				startActivity(intent);
			}
		});
	}

第二個Activity中的java程式碼
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);

		TextView tv_second = (TextView) findViewById(R.id.tv_second);
		// 得到Intent
		Intent intent = getIntent();
		// 通過key得到值 值為字串型別
		String value = intent.getStringExtra("key");
		// 在TextView上設定 值
		tv_second.setText(value);
	}

三.帶參傳遞的引數還可以是物件。 傳遞物件必須保證物件實現序列化 新建一個User類並實現序列化 Serializable
public class User implements Serializable{
	/**
	 * 序列化id,建議加上,
	 */
	private static final long serialVersionUID = 1L;
	// 使用者名稱
	private String username;
	// 密碼
	private String password;

	public User() {
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

第一個Activity中

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_first);

		Button btn_open = (Button) findViewById(R.id.btn_open);

		btn_open.setOnClickListener(new OnClickListener() {
			// 得到User類,並賦值
			User user = new User("賬號", "密碼");

			@Override
			public void onClick(View v) {
				// 建立一個意圖,引數為(當前的Activity類物件,需要開的的Activity類)
				Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
				// 放入需要傳遞的物件
				intent.putExtra("key", user);
				// 啟動意圖
				startActivity(intent);
			}
		});
	}


第二個Activity中

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);

		TextView tv_second = (TextView) findViewById(R.id.tv_second);
		// 得到Intent
		Intent intent = getIntent();
		// 通過key得到得到物件
		// getSerializableExtra得到序列化資料
		User user = (User) intent.getSerializableExtra("key");
		// 在TextView上設定 使用者名稱和密碼
		tv_second.setText(user.getUsername() + "  " + user.getPassword());
	}

在傳遞物件的時候,重點是保證物件實現序列化 Serializable並使用getSerializableExtra得到序列化資料

四.Activity帶參返回
啟動新的Activity 使用startActivityForResult(intent,requestCode)
必須重寫onActivityResult(request,result,data) 方法來獲取返回資料啟動

第一個Activity

public class FirstActivity extends Activity {
	// 定義請求碼,不同介面的跳轉請求碼要求不同,為了識別是哪個控制元件傳遞資料
	private final static int sendUser = 1;
	private TextView tv_first;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_first);

		Button btn_open = (Button) findViewById(R.id.btn_open);
		tv_first = (TextView) findViewById(R.id.tv_first);

		btn_open.setOnClickListener(new OnClickListener() {
			// 得到User類,並賦值
			User user = new User("賬號", "密碼");

			@Override
			public void onClick(View v) {
				// 建立一個意圖,引數為(當前的Activity類物件,需要開的的Activity類)
				Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
				// 放入需要傳遞的物件
				intent.putExtra("key", user);
				// 啟動意圖(意圖,請求碼(int)) 請求碼最好使用 final static定義 方便識別
				startActivityForResult(intent, sendUser);
			}
		});
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		// 如果請求碼為 sendUser 返回碼 為 RESULT_OK RESULT_OK為系統自定義的int值為 -1
		if (requestCode == sendUser && resultCode == RESULT_OK) {
			// 在TextView中設定返回資訊
			tv_first.setText(data.getStringExtra("key"));
		}
	}
}

第二個Activity

public class SecondActivity extends Activity {

	private Intent intent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);

		TextView tv_second = (TextView) findViewById(R.id.tv_second);
		intent = getIntent();
		// 通過key得到得到物件
		// getSerializableExtra得到序列化資料
		User user = (User) intent.getSerializableExtra("key");
		// 在TextView上設定 使用者名稱和密碼
		tv_second.setText(user.getUsername() + "  " + user.getPassword());
		// 找到按鈕,通過點選按鈕返回第一個介面
		Button btn_back = (Button) findViewById(R.id.btn_back);
		// 點選事件
		btn_back.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 傳送返回資料  key可自己定義,但前後必須一樣
				intent.putExtra("key", "接收到資料了,現在通知第一個Activity");
				// RESULT_OK 系統定義的int 值 為-1
				setResult(RESULT_OK, intent);
				// 關閉當前 Activity
				finish();
			}
		});
	}
}
引數傳遞與返回 需要注意前後的 鍵 相對應