【Android入門】融會貫通篇:結合上一個實例增加新技巧

一、新建針對美國、英國用戶的BMI 

  • 改造計劃

  1. 以原 BMI 應用程序爲基礎;
  2. 精簡界面,只留下必要的功能;
  3. 將界面與文字消息由中文改成英文,以符合目標用戶特性;
  4. 將計量單位由公制改爲英制,並修改相關表達式;
  5. 改進身高的輸入方式,由原本用一個“文字編輯文本框”(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”目錄名稱,與改寫後對應的支持語言關係如下
  1. 繁體中文:values-zh-rTW
  2. 簡體中文:values-zh-rCN
  3. 日文:values-ja
  4. 英文:values-en
  5. 美式英文:values-en-rUS
  6. 英式英文:values-en-rUK
  • 切換語言

  切換手機設置的語言,應用程序會改成對應的語言

三、使用接口(Adapter)

  接口:負責轉換數據源提供給界面組件的函數

  Android平臺,不允許直接將字符串數組應用在界面組件中。界面菜單的項目,都得要靠接口來提供,這樣做是“爲了保持程序的彈性”。Android平臺默認提供的接口類型有很多種,“ArraryAdapter”的作用是讀入程序中已聲明的數組,並轉換成界面組件看得懂的接口組件。還有“SimpleAdapter”(從XML文字字符串文件讀入數組)、“CursorAdapter”(從ContentProvider讀入數組)等。

四、

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章