Hallo habe es nun so gemacht.
ListView zu PDF unter Android 4.4
Ich habe mir eine eigene Klasse geschrieben, die von View ableitet und in der onDraw Methode alle notwendigen Dinge zeichnet, um eine Zeile aus der Liste zu imitieren. Auch Texte usw. habe ich per Canvas gezeichnet. Hier mal die Klasse:
1public class PrintWindow extends View
2{
3 private String name,formeclair,dosageu,dosageup1,taking,duration,enddate;
4 private Paint painter;
5 private int x,y;
6
7 public PrintWindow(Context c)
8 {
9 super(c);
10 }
11
12 public PrintWindow(Context context,String name,String formeclair,String dosageu,String dosageup1,String taking, String duration, String enddate,int x, int y)
13 {
14 super(context);
15 this.name = name;
16 this.formeclair = formeclair;
17 this.dosageu = dosageu;
18 this.dosageup1 = dosageup1;
19 this.taking = taking;
20 this.duration = duration;
21 this.enddate = enddate;
22 this.x = x;
23 this.y = y;
24
25 this.painter = new Paint();
26 painter.setStyle(Style.STROKE);
27 painter.setColor(Color.rgb(49, 85, 210));
28 painter.setStrokeWidth(4);
29 }
30
31 @Override
32 protected void onDraw(Canvas canvas)
33 {
34 super.onDraw(canvas);
35 //Draw Border
36 canvas.drawRect(0+x, 0+y, 285+x, 150+y, painter);
37
38 //Draw Header bg
39 painter.setStyle(Style.FILL);
40 canvas.drawRect(2+x, 2+y, 283+x, 25+y, painter);
41
42 //Draw gray bg
43 painter.setColor(Color.rgb(235, 235, 235));
44 canvas.drawRect(3+x, 25+y, 283+x, 150+y, painter);
45
46 //Draw white boxes
47 painter.setColor(Color.rgb(255, 255, 255));
48 canvas.drawRect(15+x, 35+y, 268+x, 80+y, painter);
49 canvas.drawRect(15+x, 90+y, 268+x, 135+y, painter);
50
51 //Draw text with white color (the values) the header,
52
53 painter.setTextSize(16);
54 if(name.length()>34)
55 painter.setTextSize(14);
56 canvas.drawText(name, 10+x,18+y, painter);
57
58 //Draw text with blue color (the names)
59 painter.setColor(Color.rgb(49, 85, 210));
60 painter.setTextSize(10);
61 canvas.drawText("Formeclair:", 20+x, 45+y, painter);
62 canvas.drawText("Dosageu:", 20+x, 60+y, painter);
63 canvas.drawText("DosageuP1:", 20+x, 75+y, painter);
64
65 canvas.drawText("Taking:", 20+x, 100+y, painter);
66 canvas.drawText("Duration:", 20+x, 115+y, painter);
67 canvas.drawText("Enddate:", 20+x, 130+y, painter);
68
69 //Draw text with black color (the values)
70 painter.setColor(Color.rgb(0,0,0));
71 painter.setTextSize(10);
72 canvas.drawText(formeclair, 150+x, 45+y, painter);
73 canvas.drawText(dosageu, 150+x, 60+y, painter);
74 canvas.drawText(dosageup1, 150+x, 75+y, painter);
75
76 canvas.drawText(taking, 150+x, 100+y, painter);
77 canvas.drawText(duration, 150+x, 115+y, painter);
78 canvas.drawText(enddate, 150+x, 130+y, painter);
79 }
80
81 @Override
82 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
83 {
84
85 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
86 setMeasuredDimension(500, 280);
87 }
Warum war das nötig?
Mein erste Ansatz war das ganze mit einer LayouFile zu machen. Jedoch stürzte alles ab wenn ich versuchte dieses dann in das PDF zu zeichnen. Warum konnte ich einfach nicht herausfinden.
Dann war meine Idee, einfach die Liste wie sie ist in das PDF zu zeichnen. Leider zeigt eine Liste immer nur die Elemente an die auch sichtbar sind, alle anderen werden erst dann geladen, wenn sie benötigt werden. Das führte also dazu, dass die ersten 3 Elemente in die PDF geschrieben wurde, danach aber für 6 Elemente Schwarz kam.
Anschliesend iteriere ich über den Adapter der Liste, bzw. in meinem Fall kamen die Daten aus einer Datenbank also bin ich direkt über die Datenbank gegangen. Für jedes Element im Adapter/Datenbank erzeuge ich ein neues Objekt der obigen Klasse und passe die Koordinaten an ( Die koordinaten passen nur im PDF, lässt man sich das in einer Activity anzeigen ist alles verloren xD)
Mit den neuen Funktionen die Android 4.4 zur Verfügung stellt zeichne ich dann die View in das PDF Dokument.
Der Code dazu sieht so aus:
1private PrintedPdfDocument generatePDF()
2 {
3 //First get all takings
4 ArrayList<databaseObject>tm = Database.getAllObjects();
5 //Start at page 0
6 int pageNumber = 0;
7
8 //Set config for pdf file
9 PrintAttributes.Builder attrsBuilder = new PrintAttributes.Builder();
10 attrsBuilder.setResolution(new PrintAttributes.Resolution("1", "Test", 300, 300));
11 attrsBuilder.setMediaSize(PrintAttributes.MediaSize.ISO_A4);
12 attrsBuilder.setMinMargins(new PrintAttributes.Margins(100,100,100,100));
13
14 //Create a new document
15 PrintedPdfDocument document = new PrintedPdfDocument(getActivity(), attrsBuilder.build());
16 //Get first page
17 Page page = document.startPage(pageNumber);
18 int x = 0;
19 int y = 0;
20 for(int i=0;i<tm.size();i++)
21 {
22 //With the current configuration exactly 10 items fit into one page of the pdf.
23 //That means after 10 items we have to start a new page!
24 if(i!=0 && i%10 == 0)
25 {
26 x=0;
27 y=0;
28 pageNumber++;
29 document.finishPage(page);
30 page = document.startPage(pageNumber);
31 }
32
33 //Draw the current item into the pdf with the help of PrintWindow class
34 Canvas canvas = page.getCanvas();
35 String duration = "";
36 if(tm.get(i).getTaking().equals("Hourly"))
37 {
38 duration = "Every "+tm.get(i).getDuration() + " Hours.";
39 }
40 else if(tm.get(i).getTaking().equals("Daily"))
41 {
42 duration = "At "+tm.get(i).getDuration() + " o clock";
43 }
44
45 PrintWindow pw = new PrintWindow(getActivity(), tm.get(i).getName(), tm.get(i).getFormeclair(),
46 tm.get(i).getDosageu(), tm.get(i).getDosageup1(), tm.get(i).getTaking(), duration,
47 tm.get(i).getEnddate(), x, y);
48
49 pw.draw(canvas);
50
51 if(i!=0 && i%2 == 1)
52 {
53 x = 0;
54 y = y+160;
55 }
56 else
57 {
58 x = 295;
59
60 }
61 }
62 document.finishPage(page);
63
64 //Create the file in the pictures directory of sd card
65 File pdf = new File(Utils.MED_LIST_PATH);
66 if(pdf.exists())
67 pdf.delete();
68
69 try {
70 pdf.createNewFile();
71 document.writeTo(new FileOutputStream(pdf));
72 } catch (IOException e) {
73 e.printStackTrace();
74 }
75 document.close();
76
77 return document;
78 }
Wen es auch interessiert... zum Drucken habe ich dann einfach auf die Samsung Mobile Print App aus dem Store zurückgegriffen. Mit Hilfe dieser starte ich folgenden Intent:
1Intent intent = new Intent("com.sec.print.mobileprint.action.PRINT");
2 Uri uri = Uri.parse(Utils.MED_LIST_PATH);
3 intent.putExtra("com.sec.print.mobileprint.extra.CONTENT", uri );
4 intent.putExtra("com.sec.print.mobileprint.extra.CONTENT_TYPE", "DOCUMENT");
5 intent.putExtra("com.sec.print.mobileprint.extra.OPTION_TYPE", "DOCUMENT_PRINT");
6 intent.putExtra("com.sec.print.mobileprint.extra.JOB_NAME", "print medicaments list");
7 startActivity(intent);
Das reicht die erzeugte PDF an die Samsung app weiter und ermöglicht das direkte drucken aus dieser heraus. Das war die einfachste Lösung für den Moment. Alternativ habe ich versucht die neuen Funktionen von 4.4 für das Drucken zu verwenden, leider konnte aber die mitgelieferte Druckererkennung in Android meinen benötigten Drucker nicht finden. Somit war die Sache erledigt
Hoffe es hilft mal irgendwann irgendwem.
Viele Grüße
— geändert am 29.11.2013, 15:16:43
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.