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

Android带数字选择器与时间选择器的二维码生成问题求助

解决方法

1. 修正Java代码

修改后的完整代码如下:

public class Visitor extends Activity {

    // 修正变量名,匹配布局里的TimePicker ID
    TimePicker timeTp;
    NumberPicker minNp;
    private String[] minutesArray;
    Button createBtn;
    ImageView qrcodeIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.qrcode);
        
        // 初始化TimePicker
        timeTp = findViewById(R.id.tp);
        // 初始化NumberPicker
        minNp = findViewById(R.id.npMin);
        minNp.setMaxValue(5);
        minNp.setMinValue(0);
        minutesArray = new String[] {"15","30","45","60","75","90"};
        minNp.setDisplayedValues(minutesArray);
        
        qrcodeIv = findViewById(R.id.ivQrcode);
        createBtn = findViewById(R.id.btnCreate);

        createBtn.setOnClickListener(view -> {
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
            try {
                // 1. 处理ID:这里用固定示例值,需用户输入可添加EditText获取
                String id = "1234567";
                
                // 2. 从TimePicker获取时间,格式化为HHmm格式(如10点19分转为1019)
                int hour = timeTp.getCurrentHour();
                int minute = timeTp.getCurrentMinute();
                String timeStr = String.format("%02d%02d", hour, minute);
                
                // 3. 获取NumberPicker选中的分钟值(取显示的字符串,而非索引)
                String selectedMin = minutesArray[minNp.getValue()];
                
                // 4. 拼接成预期格式:ID 时间 分钟
                String qrContent = id + " " + timeStr + " " + selectedMin;
                
                // 用拼接好的内容生成二维码
                BitMatrix bitMatrix = multiFormatWriter.encode(qrContent, BarcodeFormat.QR_CODE,400,400);
                BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
                Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix);
                qrcodeIv.setImageBitmap(bitmap);
                
                InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                manager.hideSoftInputFromWindow(minNp.getApplicationWindowToken(), 0);
            } catch (WriterException e) {
                e.printStackTrace();
            }
        });
    }
}

2. 关键改动说明

  • 修复TimePicker绑定:原代码里定义的DatePicker timeDp既不对类型也不匹配布局ID,改成TimePicker timeTp并通过findViewById(R.id.tp)绑定控件,才能获取用户选择的时间。
  • 获取正确的NumberPicker值:用minutesArray[minNp.getValue()]拿到用户可见的分钟字符串(比如选中第0项就是"15"),而非直接取索引值。
  • 时间格式化:通过String.format("%02d%02d", hour, minute)把小时和分钟转为两位数字的字符串(比如9点5分会变成"0905",匹配示例格式)。
  • 拼接目标格式:将ID、格式化后的时间、选中的分钟用空格拼接成预期字符串,再传入二维码生成方法。

3. 关于ID的补充(可选)

如果ID需要用户输入,可在布局中添加EditText:

<EditText
    android:id="@+id/etId"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="输入ID"
    android:inputType="number"/>

然后在Java代码中初始化并获取值:

EditText etId = findViewById(R.id.etId);
String id = etId.getText().toString().trim();
// 可选:添加空值判断
if (id.isEmpty()) {
    Toast.makeText(this, "请输入ID", Toast.LENGTH_SHORT).show();
    return;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:34:57