一.布局xml
a.布局思路
BMI指数(即身体质量指数,简称体质指数又称体重,英文为Body Mass Index,简称BMI),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。因此我们需要的参数为:身高,体重;得出的结果为:bmi值,胖瘦程度,建议。
b.xml文件
1.activity_main.xml
此布局主要拿来获取需要的数值。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/bmi_bj"
>
<!-- layout_marginTop="150dp"距离顶部150dp -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:gravity="center_horizontal"
android:id="@+id/rl_high"
>
<TextView
android:id="@+id/tv_high"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的身高:"
android:textSize="24sp"
android:textColor="#760c71"
/>
<EditText
android:id="@+id/et_high"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:inputType="number"
android:layout_alignBaseline="@+id/tv_high"
android:hint="请输入身高"
android:layout_toRightOf="@+id/tv_high"
/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:id="@+id/rl_weight"
>
<TextView
android:id="@+id/tv_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的体重:"
android:textSize="24sp"
android:textColor="#760c71"
/>
<EditText
android:id="@+id/et_weight"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:inputType="number"
android:layout_alignBaseline="@+id/tv_weight"
android:hint="请输入体重"
android:layout_toRightOf="@+id/tv_weight"
/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:id="@+id/rl_sex"
>
<RadioGroup
android:id="@+id/rg_sex"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/rb_man"
android:text="男"
android:checked="true"
/>
<RadioButton
android:id="@+id/rb_woman"
android:text="女"
/>
</RadioGroup>
</RelativeLayout>
<Button
android:id="@+id/btn_jisuan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:onClick="jisuan"
android:text="计算BMI"
/>
</LinearLayout>
效果如图:
2.activity_other.xml
此布局拿来作为结果显示,显示查询者的bmi值以及相应肥胖程度,还可以自定义显示建议内容。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_bmi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="80dp"
android:src="@drawable/bmi_1"
/>
<TextView
android:id="@+id/tv_bmiResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_gravity="left"
android:text="您的性别为男,当前bmi值为:19,"
android:textSize="18sp"
/>
<TextView
android:id="@+id/tv_suggest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginTop="20dp"
android:layout_marginLeft="40dp"
android:textSize="18sp"
android:text="建议保持在18.5~到23.9之间,您该去增肥了"
/>
</LinearLayout>
效果如图:
二.class
由于使用了两个布局,一个布局作为信息输入,另一个布局作为数据显示。
为了实现程序的功能,代码中的核心内容为:获取控件的输入值,监听计算按钮的响应,两个activity之间的传值。
a.ActivityMain.java
package com.example.android_day01_bmi;
import java.math.BigDecimal;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;
public class MainActivity extends Activity {
private RadioGroup rg_sex=null;
private RadioButton rb_man=null;
private RadioButton rb_woman=null;
private EditText et_high=null;
private EditText et_weight=null;
private String sex="男";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private void setListener() {
//设置RadioGroup监听事件,监听RadioButton的checked事件
rg_sex.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
if(checkedId==rb_man.getId())
{
rb_woman.setChecked(false);
rb_man.setChecked(true);
sex="男";
}
else if(checkedId==rb_woman.getId())
{
rb_man.setChecked(false);
rb_woman.setChecked(true);
sex="女";
}
}
});
}
private void initView() {
rg_sex = (RadioGroup)findViewById(R.id.rg_sex);
rb_man = (RadioButton)findViewById(R.id.rb_man);
rb_woman = (RadioButton)findViewById(R.id.rb_woman);
et_high = (EditText)findViewById(R.id.et_high);
et_weight = (EditText)findViewById(R.id.et_weight);
}
public void jisuan (View view)
{
//trim() 可以过滤第一个字符开始前和最后一个字符后的空格
if(et_high.getText().toString().trim().length()==0)
{
et_high.setError("请输入正确的身高");
return;
}
if(et_weight.getText().toString().trim().length()==0)
{
et_weight.setError("请输入正确的体重");
return;
}
double high=Double.valueOf(et_high.getText().toString().trim());
double weight=Double.valueOf(et_weight.getText().toString().trim());
//体质指数(BMI)=体重(kg)÷ 身高^2(m)
double bmi=weight*10000/(high*high);
//DecimalFormat format=new DecimalFormat("#0.00");
//Toast.makeText(MainActivity.this, "你的bmi数值为:"+ format.format(bmi), Toast.LENGTH_LONG).show();
BigDecimal bmi_temp = new BigDecimal(bmi);
bmi=bmi_temp.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
Toast.makeText(MainActivity.this, "你的bmi数值为:"+ bmi, Toast.LENGTH_LONG).show();
//跳转 传值
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
intent.putExtra("BMI", bmi);//BMI为传数据的标记
intent.putExtra("SEX", sex);
startActivity(intent);
}
}
b.OtherActivity.java
package com.example.android_day01_bmi;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
public class OtherActivity extends Activity {
private ImageView iv_bmi;
private TextView tv_bResult;
private TextView tv_sgt;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other_activity);
iv_bmi=(ImageView)findViewById(R.id.iv_bmi);
tv_bResult=(TextView)findViewById(R.id.tv_bmiResult);
tv_sgt=(TextView)findViewById(R.id.tv_suggest);
double bmi=getIntent().getDoubleExtra("BMI", 0);//第一个参数为标记,第二个为默认值
String sex=getIntent().getStringExtra("SEX");
//Toast.makeText(OtherActivity.this, "你的bmi数值为:"+ bmi+"性别:"+sex, Toast.LENGTH_LONG).show();
BMI_result(bmi);
}
public void BMI_result(double bmi)
{
if(bmi<18.5)
{
iv_bmi.setImageResource(R.drawable.bmi_1);
tv_bResult.setText("你的bmi数值为:"+ bmi);
tv_sgt.setText("您的体型偏瘦,注意增加营养");
}
else if (bmi>=18.5&&bmi<24) {
iv_bmi.setImageResource(R.drawable.bmi_2);
tv_bResult.setText("你的bmi数值为:"+ bmi);
tv_sgt.setText("您的体型完全正常,注意保持营养");
}
else if (bmi>=24&&bmi<28) {
iv_bmi.setImageResource(R.drawable.bmi_3);
tv_bResult.setText("你的bmi数值为:"+ bmi);
tv_sgt.setText("您的体型偏重,注意运动减肥");
}
else if (bmi>=28) {
iv_bmi.setImageResource(R.drawable.bmi_4);
tv_bResult.setText("你的bmi数值为:"+ bmi);
tv_sgt.setText("我勒个去,计算器都扎咯,赶紧减肥去!");
}
}
}
三.总结
a.三种监听事件的设置方法
1.在xml布局时,直接给控件添加onclick方法名,然后再到相应activity当中去实现onclick方法,需要注意的是此方法应该设置为public类型。
代码入下:
xml 布局
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btn_Onclick"
android:text="点我啊"
/>
activity中实现的方法:
public void btnOnclick(View view)
{
//这里写你监听到点击事件所需要做的事情
}
2.给控件添加id,在相应activity中绑定id,来进行设置监听,在实例化监听的时候,直接在参数那里new一个新的监听。
xml 布局
<Button
android:id="@+id/btn_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
/>
activity中实现的方法:
public class MainActivity extends Activity {
//先定义一个Button型变量去绑定我们要用到的控件
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载activity的布局xmml
setContentView(R.layout.activity_main);
//绑定控件id
btn=(Button)findViewById(R.id.btn);
//给控件添加监听事件
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//这里写你监听到点击事件所需要做的事情
}
});
}
3.通过implements OnClickListener接口形式来实现监听事件
xml 布局
<Button
android:id="@+id/btn_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
/>
activity中实现的方法:
public class MainActivity extends Activity implements OnClickListener{
//先定义一个Button型变量去绑定我们要用到的控件
private Button btnOk;
private Button btnCancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载activity的布局xmml
setContentView(R.layout.activity_main);
//绑定控件id
btnOk=(Button)findViewById(R.id.btnOk);
btnCancel=(Button)findViewById(R.id.btnCancel);
//给控件添加监听事件
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
swuitch(v.getId())
{
case btnOk.getId():
//检测到确定键时要做的事情
break;
case btnCancel.getId():
//检测到取消键时要做的事情
break;
default:
break;
}
}
});
}
b.两个activity之间的简单传值方式
Activityone
public class Activityone extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载Activityone的布局xmml
setContentView(R.layout.activity_one);
int x=1;
int y=2;
//定义并初始化intent
Intent intent = new Intent(Activityone.this,Activitytwo.class);
//装载数据到intent中
intent.putExtra("X", x);//X为传数据的标记,x为传送的变量
intent.putExtra("Y", y);
//开始跳转
startActivity(intent);
}
}
Activitytwo
public class Activitytwo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载Activitytwo的布局xmml
setContentView(R.layout.activity_two);
int x=getIntent().getIntExtra("X", -1);//第一个参数为传值的标记,第二个参数是函数在没找到对于标记的值时的返回值
int y=getIntent().getIntExtra("y", -1);
}
}
c.android中格式化数字的两种方式
1.使用DecimalFormat来进行格式化数值
double x=1.28931;
DecimalFormat format=new DecimalFormat("#0.00");
x=format.format(x);
2.使用BigDecimal来进行格式化数值
double x=1.28931;
BigDecimal x_temp = new BigDecimal(x);
x=x_temp.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();//第一个参数为保留的小数位数,第二参数为设置进位方式
好吧–、,拖了两天的博客今晚才写完–,拖延症是硬伤啊,哈哈哈。不过还是写完了,有兴趣学android的小伙伴可以关注我的博客和我一起学习android,ps:最近已经在接触cocos2d游戏开发了~~不过博客类容还有好多要补哦–、不过没啥子 ,总结下自己的代码,整理一下自己的思路也是挺好的,哈哈,拜拜咯,下次再见~
哦哦,差点忘了,还是给你个完整源码工程传送门(需要的可以去下载,不要积分的哟~):android计算bmi源码