乾貨分享;Android開發之Activity的建立跳轉及傳值

前言javascript

在Android系統的江湖中有四大組件:活動(Activity), 服務(Service), 廣播接收器(Broadcast Reciver)和內容提供者(Content Provider)。今天所介紹的就是Android開發中的四大組件之一:Activity,其餘那三大組件之後再進行介紹。說道Android中的Activity,若是你作過iOS開發的話,Activity相似於iOS中的ViewController(視圖控制器)。在應用中能看到的東西都是放在活動中的。活動是安卓開發比較重要的東西,是用戶交互和數據的入口。本篇博客要介紹的內容是活動的建立,活動的跳轉與值的透傳。java

iOS中的ViewController也是有本身的生命週期的,瞭解Activity或者ViewController的生命週期是頗有必要的,這要你才能搞明白在什麼時間作什麼事情。好廢話少說,Activity將要登場。web

使用Android Studio建立一個Android的Add New Activity工程(步驟略,詳見上篇博客),在這個工程中默認會有一個Blank Activity,並且在Blank Activity中自動添加了一個Text View, 上面寫着"Hello World", 運行這個工程就會看到Hello World在一個白色的活動中。瀏覽器

咱們把這個工程中建立的一個新的Activity,而後再有Hello World中添加一個按鈕,點擊按鈕跳轉到咱們建立的新的Activity中。在新的按鈕中點擊Back返回到上一個Activity中。app

1、Activity的建立與組件添加ide

1.建立一個Blank Activity佈局

在Android Studio的文件資源目錄中,選中你要建立Activity的包,右鍵單擊->New -> Activity ->各類Activity, 在這兒咱們選擇Blank Activity,點擊便可,操做以下圖所示。this


webp

點擊完後出現下面的對話框來新建一個Activity,也就是咱們自定義的Activity。Activity Name: 活動的名字,Layout Name: 活動對應佈局文件的名字,Titile: 上面導航條顯示的名字。Menu Resource Name: 菜單的xml配置文件的名稱(稍後會詳細介紹),點擊Finishi便可。spa


webp


活動建立後會在資源目錄中生成三個文件,以下圖所示,java中的SecondActivity文件有前面的"C"標誌可知,是Java的Class文件,也就是Activity對應的源文件。而Layout文件中的activity_second.xml是Activity對應的佈局文件,在佈局文件中你能夠指定給Activity添加那些控件,而且能夠控制這些控件的樣式和位置。第三個就是menu下的menu_second.xml文件,該文件是定義導航中的下拉菜單內容的,稍後給你們演示。orm


webp

2.控件添加

往Activity中添加控件就須要操做咱們的Layout文件夾下Activity所對應的xml文件了。接下來要作的事情是在MainActivity中的佈局文件中添加一個按鈕,而後在代碼中獲取一個按鈕,而且監聽按鈕的點擊事件,按鈕點擊事件觸發後彈出一個提示框。詳細的看一下如何去添加控件並監聽控件的事件。

(1) 添加按鈕

打開activity_main.xml佈局文件, 切換到Design模式下,在Design模式下你能夠以拖拽的方式來建立控件,以及定位控件。下方是添加了一個Button, 而且Button上的Text爲ShowToast(Toast是安卓中顯示信息用的組件)。


webp

你也能夠切換到Text模式下去看xml的文本,下面的大框中就是咱們剛纔拖拽出來的Button所對應的xml的內容,其中包括與佈局有關的信息:控件的寬高,上下左右的邊距等,還有控件的一些屬性:控件獨有的id以及控件顯示的文本(Text)等。固然若是對xml佈局的屬性較爲了解,就能夠使用純代碼去聲明和佈局你的控件。


webp

(2)在代碼中獲取控件

通過上面的步驟,已經聲明並配置好了一個button。若是想再代碼中進行控件的使用,首先得經過上面button的id來實例化控件。下面的代碼是在MainActivity文件中的onCreat()方法中添加的,關於onCreate方法,稍後的Activity的生命週期會詳細的介紹到。在Java源碼中能夠經過findViewById來實例化Layout佈局文件中指定的控件。上面button的id爲「myFirstButton」,因此實例化該button的方法以下:

//獲取界面上的按鈕Button myFirstButton = (Button) findViewById(R.id.myFirstButton);

實例化Button後咱們須要監聽按鈕的點擊事件,下面使用的監聽方式相似iOS中的Block回調。就是給button賦一個點擊按鈕執行的方法。點擊按鈕就會執行下方的回調方法,而且能夠經過Toast進行內容提示。

1 //按鈕點擊的回調2 myFirstButton.setOnClickListener(new View.OnClickListener() {3 @Override4 public void onClick(View v) {5 Toast.makeText(MainActivity.this, "點擊MyFirstButton", Toast.LENGTH_LONG).show();6 }7 });

通過上面的步驟,點擊ShowToast按鈕就會提示「點擊MyFirstButton」的內容,下方是執行的結果截圖:


webp


2、Activity間的跳轉與傳值

在上面咱們建立了一個名爲SecondActivity的Blank Activity一直沒有,從上面的運行效果能夠看出在MainActivity中有一個Go Second Activity的Button, 她就是用來跳轉到SecondActivity的,不一樣Activity見跳轉能夠傳值,也能夠在返回的時候返回值,接下來就介紹Activity間的跳轉和傳值問題。

  1. 使用Intent進行Activity的跳轉

Intent在Android開發中被譽爲「意圖」,從字面意思不難理解,就是「你打算去哪」。Intent與iOS開發中的NavigationController(導航控制器)極爲類似,不過又有所不一樣。NavigationController是一個「棧」形式的容器,控制器能夠經過push或者pop操做進行"入棧"和"出棧",這個入棧和出棧的操做也就是視圖控制器進行切換的操做。Intent實現原理也是同樣的,也有一個棧,這個棧中存儲的內容是一個個的Activity,Activity的Start和Finish操做對應着棧的Push和Pop操做。

(1)在"Go Second Activity" button的單擊事件中添加跳轉代碼,跳轉到SecondActiviy,代碼以下, 下方代碼是放在onCreate方法中。在下方使用的Intent類的構造器中,第一個參數是當前Activity,第二個參數是將要跳轉的Activity。經過startActivity方法來啓動Intent, 與其說是啓動Intent, 倒不如說事把當前Activity如棧,把將要顯示的Activity放入棧頂。

Button goSecondActivityButton = (Button) findViewById(R.id.go_sceond_button);

goSecondActivityButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//新建一個Intent(當前Activity, SecondActivity)=====顯示IntentIntent intent = new Intent(MainActivity.this, SecondActivity.class);//啓動IntentstartActivity(intent);

}

});

(2) 若是MainActivity中的值要傳給要跳轉過去的SecondActivity,那麼就能夠經過Intent的對象中的putExtra方法來進行傳值。在上面的代碼startActivity()方法的上方加上下面這段代碼就是給目標Activity傳值。data是一個String類型的變量,其中存的值是要傳給將要跳轉的Activity的。對象intent經過調用putExtra來進行傳值,第一個參數是值得名字,也就是值的key, 在下個Activity中經過這個key來獲取對應的value。

1 //傳值給下一個Activity2 String data = "我是上一個Activity中傳過來的值";34 intent.putExtra("extra_data", data);

(3) 在新的Activity中咱們須要獲取傳過來的值顯示在TextView上,而且點擊一個Back按鈕返回到上一層Activity,具體代碼以下。這些代碼是放在第二個Activity的onCreate()方法中的。能夠經過getIntent獲取是經過那個Intent跳轉的,換句話說事獲取當前的導航棧。獲取Intent對象後,經過getStringExtra()方法傳入一個相應的鍵,經過這個鍵來獲取值。由於咱們傳入的值是String類型的因此用getStringExtra(), 不一樣類型的值對應着不一樣的方法。而後把獲取的值顯示在TextView上。以後點擊Button返回。 Button中的finish()方法是結束當前Activity,就會自動返回上一個Activity。TextView和Button也是經過拖拽的方式來獲取的,而後經過id進行事件的處理和賦值。

1 //獲取上一個Activity傳過來的值2 Intent intent = getIntent();3 String data = intent.getStringExtra("extra_data");45 //將獲取的值顯示在TextView上6 TextView dataTextView = (TextView) findViewById(R.id.data_text_view);7 dataTextView.setText(data);89 //點擊Button返回上一個Activity10 Button backButton = (Button) findViewById(R.id.bank_button);11 backButton.setOnClickListener(new View.OnClickListener() {12 @Override13 public void onClick(View v) {14 finish();15 }16 });

通過上面的步驟,最終運行效果以下,點擊MainActivity中的Go Second Activity按鈕就會跳轉到第二個Activity,而且把第一個頁面中傳的值會在第二個Activity中進行顯示。點擊SecondActivity中的Back按鈕就會執行finish()方法返回上一個Activity。


webp

2.使用Intent打開系統功能

你能夠以協議的方式打開系統的某些功能,好比打開系統的瀏覽器,系統的撥號鍵盤等。在iOS也是這樣,不過是經過Application對象打開某些協議如tel://撥號協議等來調用系統功能。在安卓系統中也能夠經過Intent對象來作這些操做。

(1)調用瀏覽器打開連接的代碼以下,下方代碼是調用瀏覽器打開連接。ACTION_VIEW是比較智能的,他會經過用戶傳入的數據來打開相應的應用,下方是經過setData傳入的網址,因此就會調用瀏覽器,若是傳入的時tel:10010, 就會調用撥號盤。

Button openBaiduButton = (Button) findViewById(R.id.open_baidu_button);

openBaiduButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//調用本地瀏覽器打開網址Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));

startActivity(intent);

}

});

(2)調用撥號盤你能夠經過上面的方式改變一下傳入的數據便可,可是你還能夠經過Intent.ACTION_DIAL也是能夠調用撥號盤的,具體代碼以下所示:

1 Button telPhoneButton = (Button) findViewById(R.id.tel_number);2 telPhoneButton.setOnClickListener(new View.OnClickListener() {3 @Override4 public void onClick(View v) {5 Intent intent = new Intent(Intent.ACTION_DIAL);6 intent.setData(Uri.parse("tel:10010"));7 startActivity(intent);8 }9 });

點擊上方兩個按鈕第一個會經過瀏覽器打開網址,第二個會打開撥號盤,運行效果以下所示。


webp


3.從返回中的Activity中獲取值

從上面的實例中可知,咱們能夠把值從一個Activity中傳入到下一個Activity中。接下來要作的事情恰好相反,是從返回的頁面中獲取值。這種傳值也是經過Intent來作的。咱們在MainAcvitiy中添加一個按鈕「Go Third Activity」,點擊按鈕跳轉到第三個Activity中,而後返回獲取第三個Activity中傳過來的值。

(1)跳轉時經過startActivityForResult()方法來進行值得回傳,第一個參數就是intent對象,第二個參數是requestCode(請求碼)。requestCode在返回後的回調方法中會使用到。

Button goThiredActivityButton = (Button) findViewById(R.id.go_third_button);

goThiredActivityButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//從下一個Activity中獲取數據Intent intent = new Intent(MainActivity.this, ThirdActivity.class);

startActivityForResult(intent, 1);

}

});

(2)在ThirdActivity中要作的事情就是經過Intent返回值,具體代碼以下所示,返回值也是經過Intent對象的putExtra方法,而後去執行setReault方法便可。setResult()方法的第一個參數是resultCode(結果碼),也是在上一個Activity中接收值的回調中使用。

Button backButton = (Button) findViewById(R.id.third_back_button);

backButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {

Intent intent = getIntent();

intent.putExtra("data_return", "我是第三個Activity中返回的數據");

setResult(RESULT_OK, intent);

finish();

}

});

(3)接着就得在MainActivity中去重寫處理返回值的回調方法了,也就是onActivityResult回調方法。在方法中經過key來獲取傳過來的值,並把值賦值給MainActivity中的TextView具體代碼以下:

1 @Override2 protected void onActivityResult(int requestCode, int resultCode, Intent data) {3 switch (requestCode) {4 case 1:5 if (resultCode == RESULT_OK) {6 String returnedData = data.getStringExtra("data_return");78 TextView returnedDataTextView = (TextView) findViewById(R.id.return_textview);9 returnedDataTextView.setText(returnedData);10 }11 break;12 }13 }

通過上面的步驟,運行效果以下,點擊Go Third Activity會跳轉到ThirdActivity中,而後從ThirdActivity中點擊Back按鈕進行返回就會在上一個Activity中的TextView上顯示ThirdActivity中返回的值,具體效果以下所示。


webp

相關文章
相關標籤/搜索