今天原本是要分享Android元件觸發事件的四種方法,
不過忽然發現我應該要先講重構這個部分之後,
再去講觸發事件的方法,
那到底什麼是重構呢?
當一段程式被寫出來之後,我們要做的事,就是修改它與維護它。一旦程式越長越複雜,混亂到無法維護的境界時,就只好砍掉重練。所以,若我們能夠透過某些方式,例如重新組織或部分改寫程式碼,好讓程式再次變得容易維護,我們就可以為自己省下許多時間,接受更多挑戰。
「將程式碼做更動以增加可讀性或是簡化結構,而不影響輸出結果」的過程,有個專有名詞稱為「重構」。「重構」的方法就是在一次次檢查程式碼的過程中,透過一些小修改,讓程式的閱讀與運作都變得更順暢。
平常就習慣把平凡的「重構」做好一點點,長久累積,自然會形成好的程式。
以下是這個程式重構之後的結果,
在此只列出Java檔案的部分,
package com.example.user.mybmi;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.LocaleList;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.text.DecimalFormat;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//取得控制項物件
initViews();
//設定監聽事件
setListensers();
}
private Button button_calc;
private EditText num_height;
private EditText num_weight;
private TextView show_result;
private TextView show_suggest;
//取得控制項物件
private void initViews()
{
button_calc = (Button)findViewById(R.id.button);
num_height = (EditText)findViewById(R.id.height);
num_weight = (EditText)findViewById(R.id.weight);
show_result = (TextView)findViewById(R.id.result);
show_suggest = (TextView)findViewById(R.id.suggest);
}
//設定監聽事件
private void setListensers()
{
button_calc.setOnClickListener(calcBMI);
}
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
//身高
double height = Double.parseDouble(num_height.getText().toString())/100;
//體重
double weight = Double.parseDouble(num_weight.getText().toString());
//計算出BMI值
double BMI = weight / (height*height);
//結果
show_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
//建議
if(BMI > 25) //太重了
show_suggest.setText(R.string.advice_heavy);
else if(BMI < 20) //太輕了
show_suggest.setText(R.string.advice_light);
else //剛剛好
show_suggest.setText(R.string.advice_average);
}
};
}
在這裡我們可以看到,
我們把元件的宣告都放在一起,
private Button button_calc;
private EditText num_height;
private EditText num_weight;
private TextView show_result;
private TextView show_suggest;
Create之後第一件事,
就是先取得控制項的物件
initViews();
private void initViews()
{
button_calc = (Button)findViewById(R.id.button);
num_height = (EditText)findViewById(R.id.height);
num_weight = (EditText)findViewById(R.id.weight);
show_result = (TextView)findViewById(R.id.result);
show_suggest = (TextView)findViewById(R.id.suggest);
}
接下來就要定義監聽事件
setListensers();
private void setListensers()
{
button_calc.setOnClickListener(calcBMI);
}
以下是按鈕點擊後的事件
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
//身高
double height = Double.parseDouble(num_height.getText().toString())/100;
//體重
double weight = Double.parseDouble(num_weight.getText().toString());
//計算出BMI值
double BMI = weight / (height*height);
//結果
show_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
//建議
if(BMI > 25) //太重了
show_suggest.setText(R.string.advice_heavy);
else if(BMI < 20) //太輕了
show_suggest.setText(R.string.advice_light);
else //剛剛好
show_suggest.setText(R.string.advice_average);
}
};
這樣子整個程式就會變得比較有架構,
將宣告跟方法分開,
未來如果要改程式,
也會比較容易修改,
-- 後記
有時候我會在 initViews(); 後面再加一個 initDatas();
用來定義元件的初始資料及我們要設定的系統值,
當然重構的方式不是只有一種,
不過一兩年前看到的文章跟這一次看到的,
好像都是建議這樣子做,
我自己覺得用起來也還蠻順的,
暫時就不打算去做其他的思考了.
小魚大大你好
DecimalFormat nf = new DecimalFormat("0.00");
這段是什麼意思@@???
其實, 你可以請教一下谷先生.
不好意思 小弟最近剛接觸 基礎還很不夠 想問一下為啥這邊要加分號
一個function的結尾吧,
Java我現在比較少碰了,
有的語言是可加可不加.