2.1 活動
2.2 活動的創(chuàng)建
創(chuàng)建活動越平、創(chuàng)建布局(如何定義一個(gè)id的格式:@+id/id_name)、加載布局陵究、在AndroidManifest中注冊活動(可以聲明為主活動)。活動中還能做什么医瘫?如下:
2.2.1 Toast
Toast是一種非常好的提醒方式。
- 定義一個(gè)彈出Toast的觸發(fā)點(diǎn)(比如按鈕)
按鈕如何創(chuàng)建旧困?
通過findViewById(傳入按鈕的id)創(chuàng)建一個(gè)按鈕醇份,然后在按鈕上注冊一個(gè)監(jiān)聽器(為了監(jiān)聽“點(diǎn)擊 click”),監(jiān)聽器要重寫onClick方法吼具,表示當(dāng)點(diǎn)擊了按鈕之后要做的事情僚纷。
在這個(gè)例子中,點(diǎn)擊了按鈕之后要做的事情就是給出一個(gè)提醒(Toast)
- Toast通過makeText方法創(chuàng)建拗盒,傳入三個(gè)參數(shù)(上下文怖竭、顯示的文本內(nèi)容、顯示時(shí)長)
2.2.2 Menu
- 在res文件夾下創(chuàng)建一個(gè)新的菜單文件陡蝇,在里面寫好菜單(item)
- 在活動文件中重寫onCreateOptionsMenu()方法
- 定義菜單響應(yīng)事件痊臭,在活動文件中重寫onOptionsItemSelected方法
2.3 Intent——在活動之間穿梭
如何從一個(gè)活動跳轉(zhuǎn)到另一個(gè)活動呢?
Intent分為顯示和隱式
顯示創(chuàng)建的構(gòu)造函數(shù):Intent(啟動活動的上下文登夫,想要啟動的目標(biāo)活動)
隱式的話呢广匙,就要是靠一系列action和category來指定的。
只有當(dāng)intent的action和category和活動的action和category完全匹配時(shí)恼策,這個(gè)活動才會響應(yīng)該intent
隱式的寫法
- 首先在AndroidManifest中指定活動的action和category
- 然后在另一個(gè)活動中使用intent隱式的構(gòu)造函數(shù)
Intent intent = new Intent("com.example.activitytest.ACTION_START"); intent.addCategory("com.example.activitytest.MY_CATEGORY"); startActivity(intent);
在intent的構(gòu)造函數(shù)中傳入的是action的字符串鸦致,可以用addCategory方法增加category限制,同時(shí)不要忘記涣楷,有一個(gè)默認(rèn)的category——android.intent.category.DEFAULT分唾,完全匹配時(shí)才會響應(yīng)哦。
- startActivity()方法用于啟動活動狮斗,它接收一個(gè)Intent參數(shù)鳍寂,將創(chuàng)建好的Intent傳入即可。
2.3.1 隱式Intent的更多用法
使用隱式Intent不僅可以啟動自己程序內(nèi)的活動情龄,還可以啟動其他程序的活動迄汛。如打開網(wǎng)頁捍壤、打電話等。
2.3.2 向下一個(gè)活動傳遞數(shù)據(jù) & 返回?cái)?shù)據(jù)給上一個(gè)活動
- 向下傳遞數(shù)據(jù)
// 活動1把要傳遞的數(shù)據(jù)暫存在Intent中
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
//活動2把數(shù)據(jù)從Intent中取出來
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
- 向上傳遞數(shù)據(jù)
使用startActivityForResult()啟動活動鞍爱,可以在活動銷毀的時(shí)候鹃觉,能夠返回一個(gè)結(jié)果給上一個(gè)活動。
//活動1使用startActivityForResult()啟動活動2
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
//活動2創(chuàng)建了一個(gè)按鈕睹逃,功能:首先在intent中存入想要傳遞給活動1的數(shù)據(jù)盗扇,
//接著調(diào)用setResult()方法,有兩個(gè)參數(shù):setResult(處理結(jié)果沉填,帶有數(shù)據(jù)的intent)疗隶,
//最后finish()用于銷毀活動
Button button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getIntent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
});
由于是使用startActivityForResult()啟動活動2的,所以當(dāng)活動2被銷毀之后會回調(diào)上一個(gè)活動的onActivityResult()方法翼闹,所以需要重寫活動1的onActivityResult()方法斑鼻。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//requestCode用于分辨是哪一個(gè)活動傳過來
switch(requestCode){
case 1:
//resultCode表示活動的處理結(jié)果
if(resultCode == RESULT_OK){
//從帶有數(shù)據(jù)中的intent中取出數(shù)據(jù)
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);
}
break;
default:
}
}
當(dāng)然,如果用戶不是通過活動2中的按鈕銷毀這個(gè)活動猎荠,而是通過按下“back”鍵銷毀坚弱,可以通過重寫活動2中的onBackPressed()方法來解決。
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_back", "Hello FirstActivity back");
setResult(RESULT_OK, intent);
finish();
}
但是這一塊關(guān)于按返回鍵銷毀活動的代碼关摇,并沒有是數(shù)據(jù)傳遞到活動1荒叶。
emmmm.....why???