一、新建針對美國、英國用戶的BMI
-
改造計劃
- 以原 BMI 應用程序爲基礎;
- 精簡界面,只留下必要的功能;
- 將界面與文字消息由中文改成英文,以符合目標用戶特性;
- 將計量單位由公制改爲英制,並修改相關表達式;
- 改進身高的輸入方式,由原本用一個“文字編輯文本框”(TextEdit)輸入身高,改成用兩個“下拉菜單”(Spinner)選擇身高英尺、英寸。
res/layout/activity_main.xml
這裏暫時使用前面“BMI”應用程序用到的“文字編輯字段”來直接輸入英尺、英寸,以後再用下拉菜單組件來替換這兩個字段
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context=".MainActivity"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/us_height" /> <EditText android:id="@+id/feet" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <EditText android:id="@+id/inch" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/pound"/> <EditText android:id="@+id/weight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" android:inputType="numberDecimal" /> <Button android:id="@+id/submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bmi_btn"/> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="true" android:text="" /> <TextView android:id="@+id/suggest" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout>
res/value/string.xml
<resources> <string name="app_name">aBMI</string> <string name="app_label">BMI for the British system</string> <string name="us_height">Height</string> <string name="feet_prompt">Select Feet</string> <string name="inch_prompt">Select Inches</string> <string name="pound">Weight (lbs)</string> <string name="bmi_btn">Calc BMI</string> <string name="bmi_result">Your BMI is ...</string> <string name="input_error">oops,you should type numbers only</string> <string name="advice_light">You should eat more</string> <string name="advice_average">You are in good shape,keep it!</string> <string name="advice_heavy">You should lose some weight</string> <string name="advice_fat">You should do something to improve your situation,right now</string> <string name="about_label">About...</string> <string name="about_title">About aBMI 1.0</string> <string name="about_msg">aBMI is a BMI calculator for the British system,written by sc</string> <string name="ok_label">OK</string> <string-array name="feets"> <item>2 feet</item> <item>3 feet</item> <item>4 feet</item> <item>5 feet</item> <item>6 feet</item> <item>7 feet</item> <item>8 feet</item> </string-array> <string-array name="inches"> <item>0 inches</item> <item>1 inches</item> <item>2 inches</item> <item>3 inches</item> <item>4 inches</item> <item>5 inches</item> <item>6 inches</item> <item>7 inches</item> <item>8 inches</item> <item>9 inches</item> <item>10 inches</item> <item>11 inches</item> </string-array> </resources>
MainActivity.java
在“aBMI應用程序”中,我們只保留了“關於...”(MENU_aBOUT)的選項,把另一個“結束”的選項移除了。在“關於...”頁面中,也將連接首頁的按鈕移除了。
package com.demo.android.abmi; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.text.DecimalFormat; //aBMI is for British system public class MainActivity extends Activity { private static final String TAG = "aBmi"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViews(); setListensers(); } private Button button_calc; private EditText field_feet; private EditText field_inch; private EditText field_weight; private TextView view_result; private TextView view_suggest; private void findViews() { Log.d(TAG, "find Views"); button_calc = (Button) findViewById(R.id.submit); field_feet = (EditText) findViewById(R.id.feet); field_inch = (EditText) findViewById(R.id.inch); field_weight = (EditText) findViewById(R.id.weight); view_result = (TextView) findViewById(R.id.result); view_suggest = (TextView) findViewById(R.id.suggest); } //Listen for button clicks private void setListensers() { Log.d(TAG, "set Listensers"); button_calc.setOnClickListener(calcUsBMI); } private Button.OnClickListener calcUsBMI = new Button.OnClickListener() { @Override public void onClick(View view) { DecimalFormat nf = new DecimalFormat("0.00"); try { double height = (Double.parseDouble(field_feet.getText().toString())*12+Double.parseDouble(field_inch.getText().toString()))*2.54/100; double weight = Double.parseDouble(field_weight.getText().toString())*0.45359; double BMI = weight / (height * height); //Present result view_result.setText(getText(R.string.bmi_result) + nf.format(BMI)); //Give health advice if(BMI > 27) { view_suggest.setText(R.string.advice_fat); } else if(BMI > 25) { view_suggest.setText(R.string.advice_heavy); } else if(BMI < 20) { view_suggest.setText(R.string.advice_light); } else { view_suggest.setText(R.string.advice_average); } } catch (Exception obj) { Toast.makeText(MainActivity.this, getString(R.string.input_error), Toast.LENGTH_SHORT).show(); } } }; protected static final int MENU_ABOUT = Menu.FIRST; @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); Log.d(TAG, "open Menu"); menu.add(0, MENU_ABOUT, 0, R.string.about_label); return true; } public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); Log.d(TAG, "select Menu Item"); switch (item.getItemId()) { case MENU_ABOUT: openOptionsDialog(); break; } return true; } private void openOptionsDialog() { Log.d(TAG, "open Dialog"); new AlertDialog.Builder(this) .setTitle(R.string.about_title) .setMessage(R.string.about_msg) .setPositiveButton(R.string.ok_label, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }) .show(); } }
二、支持多國語言
要讓應用程序支持多個語言界面,不需要置換原有的語言界面。只需要在“res”目錄下新建相應的語言目錄,新建“res/values-en”來放“英文字符串”,新建“res/values-zh-rCN”來放“簡體中文字符串”。
以“簡體中文字符串”的“values-zh-rCN”目錄名稱命名方式爲例,“zh”是主語系,“h”代表“中文”。“r”字母之後的“CN”是分支,表示“簡體中文”。“r”是“revision”的意思。
values-zh-rCN/strings.xml
<resources> <string name="app_name">aBMI</string> <string name="app_label">BMI 英制計算器</string> <string name="us_height">身高</string> <string name="feet_prompt">選擇英尺</string> <string name="inch_prompt">選擇英寸</string> <string name="pound">體重 (lbs)</string> <string name="bmi_btn">計算 BMI 值</string> <string name="bmi_result">你的 BMI 值是</string> <string name="input_error">哦哦,字段中只能輸入數字喔</string> <string name="advice_light">你該多吃點</string> <string name="advice_average">你的體型很不錯喔,好好保持吧!</string> <string name="advice_heavy">你應該減肥囉!</string> <string name="advice_fat">爲了健康,你應該馬上採取一些行動囉!</string> <string name="about_label">關於...</string> <string name="about_title">關於 aBMI 1.0</string> <string name="about_msg">aBMI 是個 BMI 值計算器程序,由 sc 編寫</string> <string name="ok_label">OK</string> <string-array name="feets"> <item>2 英尺</item> <item>3 英尺</item> <item>4 英尺</item> <item>5 英尺</item> <item>6 英尺</item> <item>7 英尺</item> <item>8 英尺</item> </string-array> <string-array name="inches"> <item>0 英寸</item> <item>1 英寸</item> <item>2 英寸</item> <item>3 英寸</item> <item>4 英寸</item> <item>5 英寸</item> <item>6 英寸</item> <item>7 英寸</item> <item>8 英寸</item> <item>9 英寸</item> <item>10 英寸</item> <item>11 英寸</item> </string-array> </resources>
- “values”目錄名稱,與改寫後對應的支持語言關係如下
- 繁體中文:values-zh-rTW
- 簡體中文:values-zh-rCN
- 日文:values-ja
- 英文:values-en
- 美式英文:values-en-rUS
- 英式英文:values-en-rUK
- 切換語言
切換手機設置的語言,應用程序會改成對應的語言
三、使用接口(Adapter)
接口:負責轉換數據源提供給界面組件的函數
Android平臺,不允許直接將字符串數組應用在界面組件中。界面菜單的項目,都得要靠接口來提供,這樣做是“爲了保持程序的彈性”。Android平臺默認提供的接口類型有很多種,“ArraryAdapter”的作用是讀入程序中已聲明的數組,並轉換成界面組件看得懂的接口組件。還有“SimpleAdapter”(從XML文字字符串文件讀入數組)、“CursorAdapter”(從ContentProvider讀入數組)等。
四、