菜鸟学android之二--OnClickListener的三种实现方法 ,acticity之间的传值,数值格式化(附实例:计算BMI数值)

一.布局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>

效果如图:
activity_main效果图

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>

效果如图:
activity_other效果图

二.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源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值