上个版本中咱们让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,拿出来分享一下,但愿知情人能冒个泡...设计模式