You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Fragment中EditText取值失败及Start按钮无法点击问题解决

问题分析与解决方案

嘿,我看到你的问题了,咱们来一步步拆解并解决它~

核心问题:Start按钮无法点击的原因

你当前的代码里,在onViewCreated方法中加入了这段判断:

if (txtWeight.getText().toString().isEmpty()) {
    return;
} else {
    weight = txtWeight.getText().toString();
    weightInKg = Float.parseFloat(weight);
}

当Fragment刚创建时,用户还没机会在EditText里输入体重,txtWeight肯定是空的,这时候代码会执行return,直接跳过了后面按钮点击事件的初始化代码(btnRunningModeStart.setOnClickListener(...)和btnShowRunningHistory.setOnClickListener(...))。这就导致按钮根本没有绑定点击逻辑,自然点不动啦!

正确的实现思路

获取体重的逻辑不应该放在onViewCreated(界面刚加载时),而应该放在用户触发操作的时候(比如点击Start按钮时),或者在需要计算卡路里的时机再获取。这样既不会阻塞按钮初始化,也能保证拿到用户输入的最新体重值。

具体修改步骤

1. 移除onViewCreated中的体重判断代码

先把那段导致按钮初始化失败的代码删掉,让按钮的点击事件能正常绑定:

// 删掉这段代码
/*
if (txtWeight.getText().toString().isEmpty()) {
    return;
} else {
    weight = txtWeight.getText().toString();
    weightInKg = Float.parseFloat(weight);
}
*/

2. 在点击Start按钮时验证并获取体重

修改onClick_StartRunningMode方法,在启动跑步模式前先检查用户是否输入了有效的体重:

private void onClick_StartRunningMode(View v) {
    // 1. 获取并验证体重输入
    String weightStr = txtWeight.getText().toString().trim();
    if (weightStr.isEmpty()) {
        Toast.makeText(getActivity(), "请先输入你的体重", Toast.LENGTH_SHORT).show();
        return;
    }
    try {
        weightInKg = Float.parseFloat(weightStr);
        // 可以再加个判断,确保体重是合理数值(比如大于0)
        if (weightInKg <= 0) {
            Toast.makeText(getActivity(), "请输入有效的体重数值", Toast.LENGTH_SHORT).show();
            return;
        }
    } catch (NumberFormatException e) {
        Toast.makeText(getActivity(), "请输入正确的体重数字", Toast.LENGTH_SHORT).show();
        return;
    }

    // 2. 原来的Start/Stop逻辑保持不变
    if(myLocation ==null) {
        new Thread(new Runnable() {
            public void run() {
                DatabaseFacade dbfacade = new DatabaseFacade(getView().getContext());
                Activity activity = new Activity(ActivityMode.RUNNING);
                activity.setActivityId(activity.getActivityId());
                activity.setStart(new Timestamp(new Date().getTime()));
                dbfacade.saveActivity(activity);
            }
        }).start();
        Toast.makeText(this.getActivity(), "Start Running mode", Toast.LENGTH_SHORT).show();
        myLocation = new MyLocation();
        myLocation.LocationStart(this);
        btnRunningModeStart.setText("Stop");
    } else {
        Toast.makeText(this.getActivity(), "Stop Running mode", Toast.LENGTH_SHORT).show();
        myLocation.LocationListenerStop();
        myLocation = null;
        btnRunningModeStart.setText("Start");
    }
}

3. 优化卡路里计算的安全性

在locationChanged方法中计算卡路里时,加个判断确保weightInKg已经被正确赋值,避免出现异常:

@Override
public void locationChanged(Location location) {
    try {
        if(lastPoint==null)lastPoint = location;
        totalDistance += CalculateDistance(lastPoint, location);
        lastPoint=location;
        txtTotalDistance.setText(totalDistance + " km");
        
        // 确保体重已有效获取后再计算卡路里
        if (weightInKg != null && weightInKg > 0) {
            caloriesBurned=CalculateCalories(totalDistance,weightInKg);
            txtCalories.setText(caloriesBurned + " kcal");
        } else {
            txtCalories.setText("请先输入体重");
        }
        
        DatabaseFacade dbf = new DatabaseFacade(getView().getContext());
        Activity activity = new Activity(ActivityMode.RUNNING);
        dbf.saveLocation(new GpsLocation(activity.getActivityId(), location.getLongitude(), location.getLatitude(), location.getAccuracy()));
    }catch (Exception E) {
        E.printStackTrace();
    }
}

这样修改后,不仅Start按钮能正常点击,还能确保只有用户输入有效体重后才会启动跑步模式,同时卡路里计算也更安全啦~

内容的提问来源于stack exchange,提问作者Janeeee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:33