读书人

Android函数复建(MVC)

发布时间: 2012-09-02 21:00:34 作者: rapoo

Android函数重构(MVC)
原的程式片段是的
1 @Override 2 public void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.main); 5 6 //Listen for button clicks 7 Button button = (Button) findViewById(R.id.submit); 8 button.setOnClickListener(calcBMI); 9 }上面的程式片段中,包含了所有 Android 程式共用的容, 整程式的大致架在前面章中已解,在我中取出我感趣的部分:
Button button = (Button) findViewById(R.id.submit); button.setOnClickListener(calcBMI);在第7行我看到一段程式宣告按物件,按物件作作的程式。 button.setOnClickListener 程式的意是指定一函式,理"按下""按"後的作。
我可以想像,在同一面中,多加入一些按位後,"onCreate" 段程式得壅,我著先此稍作修改:
首先,我可以套用 MVC 模式,宣告介面元件(按、字位)、指定函式等作抽取出, onCreate 函式改如下
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews(); setListeners(); }接著我宣告介面元件的部份成一立的「findViews」函式:
private Button calcbutton; private EditText fieldheight; private EditText fieldweight; private void findViews() { calcbutton = (Button) findViewById(R.id.submit); fieldheight = (EditText) findViewById(R.id.height); fieldweight = (EditText) findViewById(R.id.weight); }便原本很性的按「button」改名成「calcbutton」,以後在程式中一看到「calcbutton」,就知道是一按下後始理算工作的按。
同地,我也指定特定作(按按)的函式立出:
//Listen for button clicks private void setListeners() { calcbutton.setOnClickListener(calcBMI); }如此一,我就程式介面元件的宣告分,成我重的目的。
完整程式如下:
package com.demo.android.bmi; import java.text.DecimalFormat; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Bmi extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews(); setListeners(); } private Button button_calc; private EditText field_height; private EditText field_weight; private TextView view_result; private TextView view_suggest; private void findViews() { button_calc = (Button) findViewById(R.id.submit); field_height = (EditText) findViewById(R.id.height); 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 setListeners() { button_calc.setOnClickListener(calcBMI); } private Button.OnClickListener calcBMI = new Button.OnClickListener() { public void onClick(View v) { DecimalFormat nf = new DecimalFormat("0.0"); double height = Double.parseDouble(field_height.getText().toString())/100; double weight = Double.parseDouble(field_weight.getText().toString()); double BMI = weight / (height * height); //Present result view_result.setText(getText(R.string.bmi_result) + nf.format(BMI)); //Give health advice 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); } } }; }同是「calcBMI」 函式,在完整程式中,改「calcBMI」 函式原本的「OnClickListener」宣告成 「Button.OnClickListener」。改有什差呢?
原本的程式,在入(import)的部分可以看到,「OnClickListener」是自於「android.view.View.OnClickListener」函式:
import android.view.View.OnClickListener;改成 「Button.OnClickListener」後,「Button.OnClickListener」就成自於「android.widget.Button」中的「OnClickListener」函式,在查程式,整「Button」「OnClickListener」之的得更清晰。
另外,我偷偷「OnClickListener」中其他存取到的介面元件,也 findViews 宣告中:
private void findViews() { button_calc = (Button) findViewById(R.id.submit); field_height = (EditText) findViewById(R.id.height); field_weight = (EditText) findViewById(R.id.weight); view_result = (TextView) findViewById(R.id.result); view_suggest = (TextView) findViewById(R.id.suggest); }同,我也把的命名方法做了一:按的前加上 「button_」前,可入位的前加上 「field_」前,用作示的前加上「view_」前。名的命名方法一有什好呢? 好在於以後不管是在命名新,或是程式,都能以更快速度命名或理解的意,程式得更好。
我也把原本在程式中直接的字串
TextView result = (TextView) findViewById(R.id.result); result.setText("Your BMI is "+nf.format(BMI));改成
//Present result view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));

读书人网 >Android

热点推荐