Activities
- Activity指一個頁面,一個程式可能包括好幾個頁面(Activities),要由一個頁面跳到另一個頁面,可以使用startActivity(intent)方法。
- 首先建立一個新的Project,在activity_main.xml的手機中建立一個id為btnNext的Button,顯示文字為Next。
- 因為關連到第二個Activity,在左邊找到app > java > com.... > MainActivity,在com...或MainActivity上點右鍵,選擇New > Activity > Empty Activity。
點下後出現新的activity命名畫面,命名為secondActivity。
- 此時有兩個activity,先在activity_second.xml的手機中加上一個TextView,顯示其為不同的頁面。
- 在MainActivity.java內加上如下的Code。
AppActivities > MainActivity.java
- 與之前類似,針對btnNent建立觸發事件(setOnClickListener)。
- startActivity()的參數為Intent
- Intent的定義為An intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity.,設施要試著去實現Intent要求的行為。
- 根據此建構子
Intent(Context packageContext, Class<?> cls) => Create an intent for a specific component.
new一個名為intent的Intent物件。 - Context使用getApplicationContext()方法得到(或使用MainActivity.this)。
- 第二個參數則為第二個Activity(secondActivity.class)。
- 執行程式後,按下按鈕便會跳到另一個頁面。
Intent
除了可以轉換到另一個Activity,還可以在轉換過程中傳遞資訊。首先先修改在MainActivity.java內的onClick()方法如下。MainActivity.java
- 原則上就是多加了一行,使用intent.putExtra()方法,將額外的資訊傳出(Add extended data to the intent.)。
- putExtra(String name, String value),第一個參數就是個名字,第二個參數是要傳遞的資訊。
接下來修改secondActivity.java
- 使用getIntent().hasExtra()方法來判斷是否有額外資訊,hasExtra()的參數就是適才定義的名字。
- 使用getIntent().getExtras().getString("MtJade.com")方法取得要傳遞的訊息字串,再將其設為TextView要顯示的字串(或直接使用getStringExtra("MtJade.com")替代getExtras().getString("MtJade.com"))。
- 使用Bundle來傳遞多項訊息(類似傳遞物件),使用getBundleExtra("bundleName")來取得Bundle。
- 執行程式可以看到第二頁顯示傳遞的內容。
Activities outside App
除了可以轉換到APP的另一頁,還可以到其他網頁,首先先在activity_main.xml再加上一個按鈕,假定按下按鈕要轉換到Google,所以按鈕文字設為Google,ID便設為btnGoogle。接下來在MainActivity.java加上以下的程式碼。
MainActivity.java
- 使用這個Constructor來建構Intent。Intent(String action, Uri uri) => Create an intent with a given action and for a given data url.
- 使用Intent.ACTION_VIEW來得到actiona,並使用Uri.parse()來得到Uri。
- 先判斷intentGg.resolveActivity(getPackageManager())是否為空,若不是再使用startActivity()方法來轉換頁面。
- 執行程式後按下按鈕會轉換到Google頁面。
Containers -- ListView
ListView似乎在新版將被淘汰,不過還是值得玩一下,找到Palette > legacy > ListView,拖曳至手機畫面。在左邊檔案目錄中找到Android > app > res > values > strings.xml,在其中加入以下內容。strings.xml
- 加入三個string-array的資料,以供後續使用。
修改紅色方框內的名稱後按OK。多了一個名為listviewdetails.xml的tab,可以在Attributes處修改textSize(e.g. 24sp),讓顯示的文字大一些。回到MainActivity.java,修改程式碼如下:
AppListView > MainActivity.java
- 使用getResources()傳回resources,並使用getStringArray()來取得array.cars的內容。
- 使用listView.setAdapter()方法來設定Adapter,參數使用ArrayAdapter物件,舊版的generic使用
,新版直接使用<>(會出現提示)。 - 此時執行程式可觀察結果。
More
適才的例子僅為測試,只有出現車名。現在將listviewdetails.xml刪除,按右鍵選擇delete...。重新建立listviewdetails.xml,一樣在左方檔案目錄中的Android > app > res > layout上點右鍵,打開New > Layout resource file,File name一樣使用listviewdetails,但是Root element改為RelativeLayout,按OK。在出現的listviewdetails.xml的手機畫面上配置三個TextView如下,其ID分別為car, price, description。
接下來增加一個java Class,在Android > app > java > ...applistview > MainActivity按右鍵(在...applistview or MainActivity皆可)點選New > Java Class,出現視窗如下:
修改Name --> carAdapter,Superclass --> BaseAdapter。>> OK。接下來到carAdapter.java修改程式碼如下。
carAdapter.java
- 一開始可以先點一下public,然後將游標移到public上方,應該會出現一個燈泡圖樣,點一下,會出現如下畫面
點第一個Implement methods,會出現以下視窗。
點擊OK可以幫我們設定要建立的方法,可減少打字。 - LayoutInflater是abstract class。
- Instantiates a layout XML file into its corresponding View objects. It is never used directly. Instead, use Activity.getLayoutInflater() or Context.getSystemService(Class) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on.。
- 使用getSystemService(String name)方法傳回LayoutInflater物件。
MainActivity.java
- 根據剛剛建立的carAdapter建立一個物件,使用listView.setAdapter()方法設定Adapter。
- 執行程式觀察結果。
Add Activities
- 目前點擊ListView並沒有反應,若要點擊後轉換到其他頁面,如前所述,需先設計其他Activity。
- 建立一個新的名為DetailsActivity的Activity。
-
在activity_details.xml中,選擇Palette > common > ImageView,拖曳至手機畫面。此時會跳出一個視窗,需要先選擇一個預設圖案,所以點開Project,選擇第一個ic_launcher,如下圖。
按下OK後,會看到該圖案,調整一下其位置。
MainActivity.java
- 因為是在ListView內,使用setOnItemClickListener()來建立每一個item被典籍後的回應。
- 一樣使用Intent來傳遞資訊。
Add Photos
現在點任一個item看到的圖都是同一個,要改變圖案,首先先準備三張圖片,將此三張圖片放置於Android > app > res > drawablea內。接著到DetailsActivity.java修改程式碼。
DetailsActivity.java
- 設計getImg()方法來取得圖片,圖片位於R.drawable之下。
- 設計scaleImg()方法來縮放圖片,因為顯示的螢幕不大,無法承擔太大的圖檔。
- 執行程式觀察結果。