java - 字符串不是在 Android Studio 中的第一个按钮单击时构建的
问题描述
我正在制作一个文本识别应用程序,一个非常基本的应用程序。用户目前可以从他们的图库中抓取照片,它会出现在应用程序中,并带有将文本从图像转换为 pdf 格式的选项。问题是,我必须调用该函数两次才能让我的 String 变量正确获取它应该具有的信息,特别是文本识别结果。第一次,我可以看到正在使用正确的位图,并且在构建正在构建的字符串的方法中。我已经为这些情况制作了日志,以尝试追踪问题以及第一次没有正确制作的地方,但是经过数小时的搜索后我找不到任何东西。有人请指教。
private String processTextRecognitionToPDF(Text texts){
blocks = texts.getTextBlocks();
if (blocks.size() == 0) {
stringBuilder.append("There was no text found");
return null;
}
//resultText = texts.getText();
for (Text.TextBlock block : texts.getTextBlocks()) {
blockText += block.getText()+" ";
Log.e(TAG, "processTextRecognitionToPDF: checking blockText result "+blockText );
}
return blockText;
}
我尝试在上面显示的 for 循环内部、外部、其他方法中使用 stringBuilder。奇怪的是,在这里,我放置了一个日志,blockText 被视为具有我想要在其中包含的信息。
返回 blockText 是仅将其设置为等于某个值的替代方法,我认为可能在 for 循环内部会导致 blockText 被遗忘。
退出此方法后,日志显示 blockText 恢复为我为其设置的默认值。是的,我尝试使用 stringBuilder 在 for 循环中追加,因为无论如何这都是可取的。第一次没有任何工作。
然后,在我第二次点击按钮生成 PDF 时,blockText 神奇地拾取了正确的信息并按照我的需要将其加载到 PDF 中。
另一个重要的信息。当我遇到这个问题后选择一张新照片时,该新照片的第一个按钮单击将是上一张照片的文本结果。我已经尝试一直跟踪到源头,但我找不到发生这种情况的位置或原因。
更多可能相关的代码:
mGeneratePDF.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// calling method to
// generate our PDF file.
new Handler().post(new Runnable() {
@Override
public void run() {
generatePDF();
}
});
}
});
~~~~~~~~
private void generatePDF() {
PdfDocument pdfDocument = null;
if(mSelectedImage != null){
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
generatePDFFileName();
pdfDocument = new PdfDocument();
Paint paint = new Paint();
Paint title = new Paint();
PdfDocument.PageInfo mypageInfo = new PdfDocument.PageInfo.Builder(pagewidth, pageHeight, 1).create();
PdfDocument.Page myPage = pdfDocument.startPage(mypageInfo);
Canvas canvas = myPage.getCanvas();
title.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL));
title.setTextSize(10);
title.setColor(ContextCompat.getColor(this, R.color.purple_200));
title.setTextAlign(Paint.Align.CENTER);
title.setSubpixelText(true);
runTextRecogToPDF(canvas,title);
int length = stringBuilder.length();
// even though stringBuilder should be complete now, it is still empty at this point on first click
Log.e(TAG, "generatePDF: checking stringbuilder "+ stringBuilder.toString() );
if (length == defaultTextLength){
Log.e(TAG, "generatePDF: checking blocktext "+ blockText );
stringBuilder.append(blockText);
}
canvas.drawText(stringBuilder.toString(), 400, 400, title);
Log.e(TAG, "generatePDF: checking mSelectedImage is valid "+ mSelectedImage );
stringBuilder.delete(0, stringBuilder.length());
stringBuilder.append(defaultText);
pdfDocument.finishPage(myPage);
FileOutputStream os = null;
File file = new File(Environment.getExternalStorageDirectory(), fileName);
if (file.exists()){
generatePDFFileName();
file = new File(Environment.getExternalStorageDirectory(), fileName);
}
try {
os = new FileOutputStream(file);
pdfDocument.writeTo(os);
Toast.makeText(MainActivity.this, "PDF file generated succesfully.", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// below line is used
// to handle error
e.printStackTrace();
} finally {
pdfDocument.close();
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
else{
showToast("No image selected for PDF generation");
}
}
解决方案
推荐阅读
- javascript - 猫鼬节点js中的'TypeError:meme.find(...).forEach不是函数'?
- spring-data-jpa - SpringDataJPA:如何从列表字段中查询实体
- java - 如何使用分隔符按字符串(逐字而不是字符)从字符串数组 [] 中拆分字符串?
- php - 如何修复 symfony dd 函数显示空白页?
- reactjs - React-Router v4 - 如果我手动更改 url,为什么我的应用程序会重新加载?
- java - org.xml.sax.SAXParseException:prolog (JSON) 中不允许内容
- design-patterns - 掌握间接与中介者模式
- javascript - 从 ESModules 中的复杂路径导入模块的最佳方法是什么
- python - Python AccesControl AttributeError:“模块”对象没有属性“CAPI2”
- angular - 选择下拉/展平可观察