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
相关产品推荐
相关产品推荐

