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

如何刷新二维码生成器的ImageView?解决参数修改后二维码不变问题

问题:修改选择器参数后二维码不刷新

我开发了一个带有TimePicker(时间选择器)和NumberPicker(数字选择器)的二维码生成器,但修改这两个选择器的参数后,重新生成的二维码依然和之前的一致,请问如何刷新ImageView中的二维码?

相关代码

QRCode类(二维码生成页面)

public class QRCode extends Activity {

    Button doneBtn;
    ImageView qrIv;
    TextView minute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.qrcode);
        minute = findViewById(R.id.set_minute);
        doneBtn = findViewById(R.id.btnDone);
        qrIv = findViewById(R.id.ivQr);

        doneBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(QRCode.this, MainMenu.class);
                startActivity(intent);
            }
        });
        Intent intent = getIntent();
        String data = intent.getStringExtra("data");

        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            BitMatrix bitMatrix = multiFormatWriter.encode(data, BarcodeFormat.QR_CODE, 400, 400);
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix);
            qrIv.setImageBitmap(bitmap);
            InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            manager.hideSoftInputFromWindow(minute.getApplicationWindowToken(), 0);
        } catch (WriterException e) {
            e.printStackTrace();
        }
    }
}

Visitor类(选择器页面)

public class Visitor extends Activity {
    
    String def = "00 ";
    TimePicker timeTp;
    NumberPicker minNp;
    String[] minutesArray;
    Button createBtn;
    Integer id = 12345;
    String space = " ";
    String paddedId;

    StringBuilder spaceId = new StringBuilder();

    String newId;

    String data;


    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.visitor);
        minNp = findViewById(R.id.npMin);
        minNp.setMaxValue(5);
        minNp.setMinValue(0);
        minutesArray = new String[] {"15","30","45","60","75","90"};
        minNp.setDisplayedValues(minutesArray);
        timeTp = findViewById(R.id.tp);
        createBtn = findViewById(R.id.btnCreate);
        timeTp.setIs24HourView(true);

        paddedId = String.format("%08d", id);

        for(int i = 0; i < paddedId.length(); i += 2) {
            spaceId.append(paddedId.substring(i, i + 2)).append(" ");
        }

        newId = spaceId.toString().trim();

        Map<String,String> parameters = new HashMap<String,String>();
        int value = minNp.getValue();
        parameters.put("mins", Integer.toString(value));

        data = def + newId + space + String.format("%02d", timeTp.getHour()) + space + String.format("%02d", timeTp.getMinute()) + space + minutesArray[minNp.getValue()] + space;

        createBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(Visitor.this, QRCode.class).putExtra("data", data));
            }
        });
    }
}

问题根源

  • Visitor类的data变量仅在onCreate方法中初始化一次,点击生成按钮时没有重新获取选择器的最新参数,导致始终传递初始值给QRCode页面
  • QRCode页面仅在启动时生成一次二维码,若Activity被复用(非默认启动模式),无法接收新数据更新二维码

修复方案

1. 修改Visitor类,实时获取选择器参数

将生成data的逻辑移到按钮点击事件内,确保每次点击都能拿到选择器的最新值:

public class Visitor extends Activity {
    
    String def = "00 ";
    TimePicker timeTp;
    NumberPicker minNp;
    String[] minutesArray;
    Button createBtn;
    Integer id = 12345;
    String space = " ";
    String paddedId;
    StringBuilder spaceId = new StringBuilder();
    String newId;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.visitor);
        minNp = findViewById(R.id.npMin);
        minNp.setMaxValue(5);
        minNp.setMinValue(0);
        minutesArray = new String[] {"15","30","45","60","75","90"};
        minNp.setDisplayedValues(minutesArray);
        timeTp = findViewById(R.id.tp);
        createBtn = findViewById(R.id.btnCreate);
        timeTp.setIs24HourView(true);

        // ID格式化逻辑仅需执行一次
        paddedId = String.format("%08d", id);
        for(int i = 0; i < paddedId.length(); i += 2) {
            spaceId.append(paddedId.substring(i, i + 2)).append(" ");
        }
        newId = spaceId.toString().trim();

        createBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 每次点击时实时生成最新的data
                String data = def + newId + space 
                        + String.format("%02d", timeTp.getHour()) 
                        + space + String.format("%02d", timeTp.getMinute()) 
                        + space + minutesArray[minNp.getValue()] + space;
                startActivity(new Intent(Visitor.this, QRCode.class).putExtra("data", data));
            }
        });
    }
}

2. 优化QRCode类,支持接收新数据更新二维码

新增generateQRCode方法统一处理二维码生成逻辑,并在onNewIntent中处理新的Intent数据,避免Activity复用导致的二维码不更新问题:

public class QRCode extends Activity {

    Button doneBtn;
    ImageView qrIv;
    TextView minute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.qrcode);
        minute = findViewById(R.id.set_minute);
        doneBtn = findViewById(R.id.btnDone);
        qrIv = findViewById(R.id.ivQr);

        doneBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(QRCode.this, MainMenu.class);
                startActivity(intent);
            }
        });
        // 处理初始Intent数据
        generateQRCode(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        // 处理新的Intent数据,重新生成二维码
        generateQRCode(intent);
    }

    private void generateQRCode(Intent intent) {
        String data = intent.getStringExtra("data");
        if (data == null || data.isEmpty()) {
            return;
        }
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            BitMatrix bitMatrix = multiFormatWriter.encode(data, BarcodeFormat.QR_CODE, 400, 400);
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix);
            qrIv.setImageBitmap(bitmap);
            InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            manager.hideSoftInputFromWindow(minute.getApplicationWindowToken(), 0);
        } catch (WriterException e) {
            e.printStackTrace();
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:37:47