如何刷新二维码生成器的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
相关产品推荐
相关产品推荐

