上個版本中咱們讓EditText適應了更實際的輸入數值,爲了讓程序更加像一個真實的應用,如今爲程序添加一個菜單列,這個菜單列中包含兩項一個是「關於」是用來介紹程序的版本,做者等信息,一個是「退出」是用來關閉程序的。而後對「關於」菜單項添加事件。java
string.xml和activity_main.xml不變
改進後的MainActivity.java程序代碼以下:android
package pz.soft.chen; import java.text.DecimalFormat; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { /** *2.2 *爲了使程序更加像一個真實的應用程序 *如今要爲程序添加一個菜單列 *菜單列中包含「關於」和「退出」兩項 *按下「關於」時會彈出有關程序的版本,做者等的信息 *按下「退出」時程序會自動關閉 * */ private double height = 0; private double weight = 0; private EditText tt1 = null; private EditText tt2 = null; private Button bt1 = null; private TextView bmi_Result = null; private TextView bmi_Suggest = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViews(); addEvent(); } //獲取程序所需控件 public void findViews(){ tt1 = (EditText)findViewById(R.id.tt1); tt2 = (EditText)findViewById(R.id.tt2); bt1 = (Button)findViewById(R.id.bt1); bmi_Result = (TextView)findViewById(R.id.tv3); bmi_Suggest = (TextView)findViewById(R.id.tv4); } //爲程序添加事件 public void addEvent(){ bt1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { DecimalFormat df = new DecimalFormat("0.0"); try{ //獲取身高 height = Double.parseDouble(tt1.getText().toString())/100; //獲取體重 weight = Double.parseDouble(tt2.getText().toString()); //計算BMI的值 double BMI = weight/(height*height); bmi_Result.setText("your BMI is:" + df.format(BMI)); //根據BMI結果值,選擇應該提示的建議 if(BMI > 25){ bmi_Suggest.setText(R.string.advice_heavy); }else if(BMI < 20){ bmi_Suggest.setText(R.string.advice_light); }else{ bmi_Suggest.setText(R.string.advice_average); } }catch(Exception e){ //顯示提示信息 Toast.makeText(MainActivity.this, R.string.input_error, Toast.LENGTH_SHORT).show(); } } }); } //定義兩個常量做爲菜單項的標識符 private static final int MENU_About = Menu.FIRST; private static final int MENU_Quit = Menu.FIRST+1; //重寫建立菜單列的方法 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //添加兩個菜單項 menu.add(0, MENU_About, 0, "關於..."); menu.add(0, MENU_Quit, 0, "退出"); return super.onCreateOptionsMenu(menu); } //重寫菜單選項選中時的方法 @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case MENU_About: openOptionDialog(); break; case MENU_Quit: finish(); break; default: return super.onOptionsItemSelected(item); } return super.onOptionsItemSelected(item); } //添加一個對話框 private void openOptionDialog(){ //new AlertDialog.Builder(this).setTitle("關於 Android BMI").setMessage("Android BMI Calc").show(); //因爲android採起一種特殊的設計模式因此上面的寫法是合法的,可是看着很糾結啊,那咱們試試下面一種寫法 //若是你對這個東西AlertDialog.Builder看着糾結的話,你就把它整個當成一個類名來理解 AlertDialog.Builder abuilder = new AlertDialog.Builder(this); abuilder.setTitle("關於 Android BMI");//爲對話框添加標題 abuilder.setMessage("Android BMI Calc");//爲對話框添加內容 //添加一個確認按鈕 abuilder.setPositiveButton("確認", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); //添加一個取消按鈕 abuilder.setNegativeButton("首頁", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //爲了預防輸入的uri不合法而致使程序的崩潰,作一下異常處理 try{ Uri uri = Uri.parse("http://www.google.com"); //建立一個意圖並啓動 Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); }catch(ActivityNotFoundException e){ //API中定義的是NullPointerException //二者都是運行時異常沒有繼承關係 Toast.makeText(MainActivity.this, "URI輸入不合法", Toast.LENGTH_SHORT).show(); }catch(Exception e){ Log.v("Exception", e.getMessage()); } } }); abuilder.show();//最後一步將對話框顯示出來 //上面的寫法是否是清晰而容易理解了呢 } }
這裏在處理Uri輸入非法的異常時,因爲我將地址寫成了「www.google.com」而出現了一點小意外,由於我查閱API的時候文檔上說明將會拋出NullPointerException異常,所以我用此異常去捕捉但卻發現捕捉不到,後來覺得是URISyntaxException異常,結果也沒捕捉到,最後發現是ActivityNotFoundException 異常,查閱API發現這兩個異常都是運行時異常可是它們之間卻沒有繼承關係,不知道這是否是文檔的一個bug,拿出來分享一下,但願知情人能冒個泡...設計模式