一、MainActivity
(一)整体结构(略package+import)
1.public class MainActivity extends Activity
1)声明成员变量
用private,使外部通过get/set方法来获取可以获取的内部数据。Layout里面有什么,activity需要用到什么,就声明什么
private EditText heightEditText;
private RadioGroup sexRadioGroup;
private Button resetButton;
private String sexString = "男";
*这里的sexString没有赋初值的话,下面的onCheckedChanged方法就会崩溃。因为默认是选择男,若果测试者不改变选项的话,其实sexString里是没有值的
2)入口方法 protected void onCreate(Bundle savedInstanceState)
目录式结构。只列出会用到的方法。
tip:声明完一个方法后,按Ctrl+1 自动创建方法。
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//把mainactivity.java和activity_main.xml 联系在一起
fineViews();//从布局代码中找到相应的控件
setLisenter();//用于监听。
3)private void setLisenter()
监听方法。包含多个内部监听类。给按钮添加点击事件OnClickListener,要重写OnClickListener()方法。当按钮状态转换时系统会自动调用OnCheckedChangeListene方法
①sexRadioGroup.setOnCheckedChangeListener ( new OnCheckedChangeListener ( ) { public void onCheckedChanged(RadioGroup arg0, int arg1 ) {}} //设置RadioGroup状态转变时的监听。参数是监听对象,创建方法是直接new,然后重写OnCheckedChangeListener()的OnCheckedChangeListener方法
②startTestButton.setOnClickListener ( new OnClickListener ( ) { public void onClick( View v) {}})
4)private void fineViews()
寻找控件。基本上用到哪个控件,就要在此方法中 find 哪个控件。Ctrl+1 可以自动添加强制类型转换。
heightEditText = (EditText) findViewById(R.id.height_edt);
weightEditText = (EditText) findViewById(R.id.weight_edt);
sexRadioGroup = (RadioGroup) findViewById(R.id.sex_rg);
startTestButton = (Button) findViewById(R.id.start_test_btn);
resetButton = (Button) findViewById(R.id.reset_btn);
(二)局部细节
1.intent方法
(1)mainactivity
Intent intent = new Intent(MainActivity.this,BMIResultActivity.class);
跳转页面:通过intent类的对象实现,创建intent类对象实现,选择双参数构造方法new Intent(MainActivity.this,BMIResultActivity.class)。参数1:从哪个activity中起跳,参数2:跳到哪个activity中
intent.putExtra("height", height);
传递数据:向BMIactivity传递数据用于显示,把要传递的数据放入intent中intent.putExtra(arg1,arg2) arg1是键,arg2是值。通过arg1和arg2,就在intent中保存了一个键值对(一一对应),则可通过键去找相应的值。在取值时一定要保证键相同.
startActivity(intent);
实现跳转
(2)BMIResultActivity
Intent intent = getIntent();
取出上个页面的传递值
double height = intent.getDoubleExtra("height", 0);
从intent对象中,根据放入值的键来取相应值
DecimalFormat format = new DecimalFormat("0.00");
对数据进行格式化 DecimalFormat 构造参数:数据格式字符串。格式化成0.00的格式
bmiTextView.setText("您的BMI指数为"+format.format(bmi));
把数据显示到控件上
2.public void onCheckedChanged(RadioGroup arg0, int arg1)
参数①:状态改变的RadioGroup对象。参数②:RadioGroup对象中被选中的按钮的Id。根据参数2确定是哪个按钮被选中。内含switch方法或if方法
3.吐司 Toast.makeText()
Toast.makeText(MainActivity.this, "您选择的性别是"+sexString, 1).show();
参数1:上下文,说明在那个页面显示吐司。参数2:显示的内容。参数3:显示的时间(秒)
4.getText()
String heightString = heightEditText.getText().toString().trim();
用getText()取出输入内容,返回值是Editable对象可变字符串。用toString()将其转化为字符串,并用trim()方法去除其中没用的字符,如:回车。
5.类型转换
double height = Double.valueOf (heightString)/100;
6.set方法
bodyStateImageView.setBackgroundResource(R.drawable.bmi_4);
bodyStateTextView.setText("您现在处于:\n严重肥胖状态,请立刻减肥");
在bodyStateTextView这个TextView里放入图片和文字。
二、BMIResultActivity
(一)整体结构
findViews();
三、规范
(一)命名
1.变量命名
①全英文,不准有拼音
②首字母小写,之后所有单词的首字母大写(驼峰式命名法)
③遵循准则
④变量名后缀尽量不缩写,全拼(变量种类很多,可能有缩写相同, 无法区分)
2.类名:所有首字母都大写
(二)常识
1.Android 的界面叫activity,包含
1)名字Activity.java(逻辑代码) 一定是继承自activity类,页面逻辑,一般包含
1. onCreate(Bundle savedInstanceState) 加载页面时,Android系统调用,程序员只需在oncreate里写逻辑代码
2. public boolean onOptionsItemSelected(MenuItem item) 菜单逻辑
3.onOptionsItemSelected(MenuItem item) 菜单某一项被选中
2)名字.xml 页面的布局文件
2.代码书写流程。在写方法时,不要马上写方法主逻辑,应该先进行异常处理。当把所有异常处理完成后,再写主逻辑。
3.注意事项
1)判断字符串是否为空,用textUtils的isEmpty()方法,而不是用字符串本身(height.isEmpty)
2) 在代码中用到上下文作为参数进行传递时,一定要确定this确定的是那个类。
3) activity继承自Context,当有系统方法要求传递Context时,有可能就是传递activity。(Context有很多子类)
4)前端应用要遵循显示逻辑与数据运算逻辑分离,不能混在一起。activity理想状态只有控制页面显示的代码。
5) 通过对象来处理页面数据,做到数据逻辑与代码逻辑的分离
(三)调试
1.代码错误
当bug崩溃时,根据logCat的提示(找自己能看懂的代码,比如指示了哪一行出错的错误提示)。根据提示,在这几行打几个断点,用小虫debug。debug会停在断点处,鼠标放上去会浮现变量值等具体情况。之后可用步入等一步步调试。
如果是数据出错,则顺着数据流一步步查看。(比如BMI项目中的sexString。程序崩溃是因为sexString没有赋初值)
2.代码没找出错误
或许编译时出现混乱,点project->clean... 清空编译。在点击右上角DDMS,左侧菜单栏的扩展项目里有“reset adb”。再重新编译。
3.异常处理
在写主逻辑前先进行异常处理,如BMI项目中未输入值便点击测试按钮
if (TextUtils.isEmpty(heightString)) {
heightEditText.setError ("请输入身高");
return;}
网友评论