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

底部弹窗选中单位时如何自动更新Activity的转换结果

解决单位转换器切换单位后结果TextView不更新的问题

当前代码仅完成了选中单位的存储和按钮文本的更新,但没有触发转换计算和结果TextView更新的逻辑,所以切换单位后结果不会变化。

通过在UnitMenu中定义回调接口,让菜单在选中单位时通知主Activity执行转换并更新UI,具体实现如下:

修改后的UnitMenu代码

public class UnitMenu extends BottomSheetDialogFragment {
    ListView unitList;
    String set;
    String[] units;
    ExtendedFloatingActionButton button;
    private OnUnitSelectedListener listener;

    // 定义单位选中回调接口
    public interface OnUnitSelectedListener {
        void onUnitSelected(String unitType, String selectedUnit);
    }

    // 更新构造方法,加入回调参数
    UnitMenu(String[] units, String set, ExtendedFloatingActionButton button, OnUnitSelectedListener listener) {
        this.units = units;
        this.set = set;
        this.button = button;
        this.listener = listener;
    }

    @NonNull
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.area_select_unit, container, true);
        unitList = view.findViewById(R.id.unitList);

        ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, units);
        unitList.setAdapter(adapter);
        unitList.setOnItemClickListener((parent, v, position, id) -> {
            String selectedUnit = units[position];
            if (set.equals("Select Unit From")) {
                ConverterActivity.setSelectedFromUnit(selectedUnit);
                // 通知Activity:选择了"from"单位
                if (listener != null) {
                    listener.onUnitSelected("from", selectedUnit);
                }
            } else {
                ConverterActivity.setSelectedToUnit(selectedUnit);
                // 通知Activity:选择了"to"单位
                if (listener != null) {
                    listener.onUnitSelected("to", selectedUnit);
                }
            }

            button.setText(selectedUnit);
            dismiss();
        });

        return view;
    }
}

ConverterActivity中的实现代码

// 打开"From"单位菜单时传入回调
ExtendedFloatingActionButton fromButton = findViewById(R.id.from_button);
fromButton.setOnClickListener(v -> {
    String[] fromUnits = {"米", "千米", "英尺"}; // 替换为你的实际单位数组
    UnitMenu fromMenu = new UnitMenu(fromUnits, "Select Unit From", fromButton, new UnitMenu.OnUnitSelectedListener() {
        @Override
        public void onUnitSelected(String unitType, String selectedUnit) {
            // 触发转换并更新结果
            updateConversionResult();
        }
    });
    fromMenu.show(getSupportFragmentManager(), fromMenu.getTag());
});

// 打开"To"单位菜单时传入回调
ExtendedFloatingActionButton toButton = findViewById(R.id.to_button);
toButton.setOnClickListener(v -> {
    String[] toUnits = {"米", "千米", "英尺"}; // 替换为你的实际单位数组
    UnitMenu toMenu = new UnitMenu(toUnits, "Select Unit To", toButton, new UnitMenu.OnUnitSelectedListener() {
        @Override
        public void onUnitSelected(String unitType, String selectedUnit) {
            updateConversionResult();
        }
    });
    toMenu.show(getSupportFragmentManager(), toMenu.getTag());
});

// 核心:执行转换并更新结果TextView的方法
private void updateConversionResult() {
    // 获取当前选中的单位
    String fromUnit = ConverterActivity.getSelectedFromUnit();
    String toUnit = ConverterActivity.getSelectedToUnit();
    
    // 获取输入值(根据你的布局修改EditText的ID)
    EditText inputEt = findViewById(R.id.input_edit_text);
    String inputStr = inputEt.getText().toString().trim();
    double inputValue = inputStr.isEmpty() ? 0 : Double.parseDouble(inputStr);
    
    // 执行单位转换(替换为你的实际转换逻辑)
    double result = calculateConversion(inputValue, fromUnit, toUnit);
    
    // 更新结果TextView(根据你的布局修改TextView的ID)
    TextView resultTv = findViewById(R.id.result_text_view);
    resultTv.setText(String.format("%.2f", result)); // 保留两位小数,可按需调整
}

// 示例转换逻辑,根据你的单位类型(长度、面积、重量等)实现完整逻辑
private double calculateConversion(double value, String fromUnit, String toUnit) {
    // 以长度单位为例
    if (fromUnit.equals("米") && toUnit.equals("千米")) {
        return value / 1000;
    } else if (fromUnit.equals("千米") && toUnit.equals("米")) {
        return value * 1000;
    } else if (fromUnit.equals("米") && toUnit.equals("英尺")) {
        return value * 3.28084;
    } else if (fromUnit.equals("英尺") && toUnit.equals("米")) {
        return value / 3.28084;
    }
    // 其他单位转换规则...
    return value;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:55:01