我试图从我以编程方式创建的视图中创建PDF文件。似乎只有在将视图添加到我的主布局时才能正确创建pdf,但我不想这样做。这是我的测试代码:
RelativeLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imgView = (ImageView) findViewById(R.id.imageView);
mainView = (RelativeLayout) findViewById(R.id.main_layout);
layout = new RelativeLayout(this);
RelativeLayout.LayoutParams imgParams = new RelativeLayout.LayoutParams(800, 800);
imgParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
imgParams.addRule(RelativeLayout.ALIGN_PARENT_START);
ImageView newImg = new ImageView(this);
newImg.setLayoutParams(imgParams);
newImg.setImageDrawable(imgView.getDrawable());
layout.addView(newImg);
}
private void create() {
layout.layout(0, 0, 1000, 1000);
layout.post(new Runnable() {
@Override
public void run() {
createPdf();
}
});
}
private void createPdf() {
OutputStream os = null;
File file = null;
PdfDocument pdfDoc = new PdfDocument();
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(1000, 1000, 1).create();
PdfDocument.Page page = pdfDoc.startPage(pageInfo);
layout.draw(page.getCanvas());
pdfDoc.finishPage(page);
try {
file = new File(Environment.getExternalStorageDirectory(), "page.pdf");
os = new BufferedOutputStream(new FileOutputStream(file));
pdfDoc.writeTo(os);
pdfDoc.close();
os.close();
} catch (IOException e) {
}
}
这会创建一个空的pdf。如果我在create()
中添加这两行代码,则可以:
mainView.removeAllViews();
mainView.addView(layout);
但我不想删除主视图中的内容。我怎样才能做到这一点?
我找到了一个可能的解决方案。无论出于何种原因,它想要附加到在xml中静态定义的视图。因此,在xml中定义一个具有id的空视图组。您可以在onCreate()
中获得引用,然后您基本上可以使用上面的代码,而是在此视图中使用addView()
。哦,并将视图组设置为不可见,因为您不希望它被显示。我只在一台设备上测试过。
答案 0 :(得分:1)
layout.measure(1000,1000); layout.layout(0,0,1000,1000);
我遇到了类似的问题,这为我解决了这个问题。
Android: inflating a layout and writting it to PDF produces a blank PDF