Android學習之BMI1.3

上個版本中咱們讓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,拿出來分享一下,但願知情人能冒個泡...設計模式

相關文章
相關標籤/搜索