董明華+李宏偉
摘要:AndroidStudio已經(jīng)代替了Eclipse,成為Android官方集成開發(fā)工具。文章基于AndroidStudio設(shè)計(jì)了一款身高體重計(jì)算器,通過介紹常見布局控件的用法,使初學(xué)者能夠快速入門Android APP開發(fā),了解APP界面設(shè)計(jì),用戶輸入值的獲取等知識。
關(guān)鍵詞:AndroidStudio;BMI;APP
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)35-0136-03
1 背景
BMI指數(shù),即身體質(zhì)量指數(shù),是用體重公斤數(shù)除以身高米數(shù)平方得出的數(shù)字,是目前國際上常用的衡量人體胖瘦程度以及是否健康的一個(gè)標(biāo)準(zhǔn)。體質(zhì)指數(shù)(BMI)=體重(kg)÷身高^2(m)。文章根據(jù)BMI指數(shù)開發(fā)一款簡易身高體重計(jì)算器,通過分析用戶的身高體重值,判斷其身材是否標(biāo)準(zhǔn)。
2 APP展示
最終APP效果如圖1所示,用戶輸入身高體重值后,通過單擊計(jì)算按鈕,可得出身體胖瘦程度的一個(gè)提示。
3 知識點(diǎn)分析
項(xiàng)目涉及知識點(diǎn)較為簡單,界面布局為LinearLayout,控件為EditText和Button,java源代碼部分主要是控件的初始化,取得文本輸入框的輸入值,并轉(zhuǎn)換為數(shù)值類型,然后計(jì)算出BMI指數(shù)值,并通過Toast給出提示。
4 界面設(shè)計(jì)
界面從上向下依次為身高輸入框、體重輸入框和按鈕,輸入框?qū)?yīng)Android中的EditText控件,按鈕對應(yīng)Button控件,垂直排列的布局適合用線性布局LinearLayout。布局主要作用是設(shè)置控件在屏幕上的位置,線性布局LinearLayout可以讓其中的控件水平排列或者垂直排列。
首先,在res/layout文件夾中找到自動(dòng)生成的布局文件activity_main.xml。在此文件中聲明父布局LinearLayout的排版方向?yàn)榇怪迸帕?,通過設(shè)置android:orientation的屬性值為vertical實(shí)現(xiàn)。
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
其次,設(shè)置文本輸入框EditText的寬填滿父布局,高自適應(yīng),并通過android:hint屬性設(shè)置提示語,提示語定義在res/values/strings.xml文件中。
android:id="@+id/height" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/heighthint"/> strings.xml中提示語定義格式如下所示,提示語內(nèi)容需要根據(jù)項(xiàng)目要求設(shè)置,BMI指數(shù)對應(yīng)體重單位kg,身高單位m。 最后,完成計(jì)算按鈕部分。按鈕有兩個(gè)屬性需要設(shè)置,一是設(shè)置按鈕水平居中的屬性android:layout_gravity,屬性值為center_horizontal;二是注冊按鈕事件監(jiān)聽屬性android:onClick,屬性值由開發(fā)人員自定義一個(gè)方法名。假設(shè)自定義的方法名為compute,那么在對應(yīng)的java源文件中必須自定義一個(gè)如下形式的方法: public void compute(View view){...} 5 java源代碼實(shí)現(xiàn) 創(chuàng)建BMI對應(yīng)Module的時(shí)候,自動(dòng)在src文件夾中生成MainActivity.java源文件,并實(shí)現(xiàn)Activity的onCreate生命周期方法。 在BMI項(xiàng)目中,java源代碼主要工作包括初始化文本輸入框控件,實(shí)現(xiàn)按鈕事件監(jiān)聽器注冊方法,獲取文本輸入框的輸入值并轉(zhuǎn)換為數(shù)值類型,計(jì)算BMI指數(shù)并給出提示等,下面對這些功能依次進(jìn)行講解。 5.1 初始化EditText 首先,在MainActivity中聲明EditText成員變量。 EditText heightEditText,weightEditText; 然后,在onCreate方法中通過findViewById方法初始化控件。 heightEditText = (EditText) findViewById(R.id.height); weightEditText = (EditText) findViewById(R.id.weight); 其中,R.id.height表示身高輸入框的id是height,這是由布局文件中的id值決定的,android:id="@+id/height"。 需要注意的是,控件的初始化需要在setContentView(R.layout.XXX)之后,setContentView方法指定當(dāng)前java源文件對應(yīng)的布局文件,只有在指定的布局文件中存在某個(gè)控件,已知此控件的id值,才可以通過上述方法進(jìn)行初始化工作。
5.2 Button事件監(jiān)聽器處理方法
按鈕的事件監(jiān)聽器注冊有多種處理方法,如果布局文件中已經(jīng)通過android:onClick="compute"指定了當(dāng)前按鈕的事件監(jiān)聽器處理方法,則在對應(yīng)的java源代碼文件中必須實(shí)現(xiàn)此方法。具體實(shí)現(xiàn)方式為定義一個(gè)方法,方法名必須和android:onClick的屬性值一致,方法修飾符必須是public,返回值是void,形參只有一個(gè)View類型。
public void compute(View view){...}
定義了上述方法后,只要用戶單擊了按鈕,就會(huì)回調(diào)此方法。
5.3 獲取EditText輸入值
獲取EditText輸入值必須在EditText初始化之后,同時(shí)注意獲取時(shí)機(jī),本項(xiàng)目在用戶單擊計(jì)算按鈕的時(shí)候才獲取輸入值。下面以獲取用戶身高值為例,講解其獲取步驟,獲取體重值采用同樣的步驟。
1) 調(diào)用EditText對象的getText()方法獲取Editable對象。
Editable editable = heightEditText.getText();
2) 把Editable對象轉(zhuǎn)換為字符串類型。
heightString = editable.toString();
上述兩步操作經(jīng)常合為一步執(zhí)行。
heightString = heightEditText.getText().toString();
3) 根據(jù)項(xiàng)目要求把字符串轉(zhuǎn)換為其他數(shù)據(jù)類型,本項(xiàng)目設(shè)置成double數(shù)據(jù)類型,通過調(diào)用包裝類的parseXXX方法把字符串轉(zhuǎn)換為基本數(shù)據(jù)類型。
double heightDouble = Double.parseDouble(heightString);
5.4 計(jì)算BMI指數(shù)
獲取到用戶輸入的身高體重值后,就可以計(jì)算BMI指數(shù)值了。BMI指數(shù)值為體重除以身高的平方,需要注意體重單位kg,身高單位m。為了計(jì)算的方便,設(shè)置BMI值小于18.5時(shí),表示體型偏瘦,大于23.9時(shí)偏胖,在兩者之間表示體型標(biāo)準(zhǔn)。
double result = heightDouble/(weightDouble*weightDouble);
if (result > 23.9){
消息提示
} else if(result < 18.5){
消息提示
} else {
消息提示
}
5.5 消息提示
Toast是Android中用來顯示信息的一種機(jī)制,主要用于向用戶顯示提示消息。和Dialog不一樣的是,Toast是沒有焦點(diǎn)的,而且Toast顯示的時(shí)間有限,過一定的時(shí)間就會(huì)自動(dòng)消失。
Toast的創(chuàng)建步驟如下所述:
1) 調(diào)用靜態(tài)方法makeText創(chuàng)建Toast對象。
Toast toast = Toast.makeText(Context context, CharSequence text, int duration);
方法接收三個(gè)形參。第一個(gè)參數(shù)Context表示消息提示在哪個(gè)Activity中,一般用this表明在當(dāng)前Activity中;第二個(gè)參數(shù)CharSequence代表提示語內(nèi)容,接收字符串?dāng)?shù)據(jù)類型;第三個(gè)參數(shù)int表示消息顯示時(shí)長,系統(tǒng)提供了兩個(gè)值,Toast.LENGTH_SHORT和Toast.LENGTH_LONG,分別表示短時(shí)間顯示和長時(shí)間顯示。
2) 調(diào)用Toast對象的show方法顯示消息。
toast.show();
以上兩個(gè)步驟經(jīng)常合成一步。
Toast.makeText(this,text,Toast.LENGTH_SHORT).show();
6 代碼優(yōu)化
6.1 控件初始化優(yōu)化
本項(xiàng)目比較簡單,控件只有兩個(gè)EditText需要初始化,直接在onCreate方法中操作也顯得清晰。如果控件的初始化操作較多,onCreate方法就會(huì)顯得臃腫,此時(shí)建議自定義初始化控件方法,在onCreate中調(diào)用自定義方法。
private void initViews() {
heightEditText = (EditText) findViewById(R.id.height);
weightEditText = (EditText) findViewById(R.id.weight);
……}
6.2 消息顯示優(yōu)化
上述計(jì)算BMI指數(shù)中,要寫三次Toast提示代碼,而常用的BMI指數(shù)分為五六種情形,有沒有一種方式可以簡化消息顯示代碼呢?分析Toast提示代碼,除了提示語不同外,其他代碼完全相同,因而可以把消息顯示代碼封裝為一個(gè)方法,接收一個(gè)消息提示語參數(shù)。
public void show(String text){
Toast.makeText(this,text,Toast.LENGTH_SHORT).show();}
需要用到消息顯示的時(shí)候,調(diào)用show方法,傳入一個(gè)提示語即可。
6.3 BMI數(shù)值計(jì)算優(yōu)化
按鈕監(jiān)聽方法中大量代碼被用來求解BMI數(shù)值,可以把這部分代碼封裝到一個(gè)單獨(dú)的方法中,用來計(jì)算BMI數(shù)值。
public double getBMI(){
heightString = heightEditText.getText().toString();
weightString = weightEditText.getText().toString();
heightDouble = Double.parseDouble(heightString);
weightDouble = Double.parseDouble(weightString);
result = heightDouble/(weightDouble*weightDouble);
return result;}
7 結(jié)束語
APP的開發(fā)主要分為界面設(shè)計(jì)和java源代碼實(shí)現(xiàn)兩個(gè)部分,采用的是MVC設(shè)計(jì)模式。應(yīng)用開發(fā)完成后,需要通過測試發(fā)現(xiàn)bug并加以改正。只有經(jīng)過大量的開發(fā)實(shí)戰(zhàn),才可以快速發(fā)現(xiàn)bug并改正。
參考文獻(xiàn):
[1] 劉劍橋. 基于Android的房貸計(jì)算器開發(fā)與測試[J]. 電腦編程技巧與維護(hù), 2016(5).
[2] 吳立勇, 丁作文. 基于Android系統(tǒng)的手機(jī)計(jì)算器的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電子技術(shù), 2014(4).
[3] 劉正. Android項(xiàng)目驅(qū)動(dòng)式開發(fā)教程[M]. 北京: 機(jī)械工業(yè)出版社, 2014.