Android学习之BMI1.3

上个版本中我们让EditText适应了更实际的输入数值,为了让程序更加像一个真实的应用,现在为程序添加一个菜单列,这个菜单列中包含两项一个是“关于”是用来介绍程序的版本,作者等信息,一个是“退出”是用来关闭程序的。然后对“关于”菜单项添加事件。

string.xml和activity_main.xml不变
改进后的MainActivity.java程序代码如下:

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,拿出来分享一下,希望知情人能冒个泡...

你可能感兴趣的:(Android学习之BMI1.3)