ホーム>source

私は LinearLayout を入力しようとしています simple_pdf_example.xml の内部10 printed_order_element2.xml ちょうど ListView でPDFを生成できるように(これは実際には LinearLayout です )。

問題は、 linearLayoutView.addView(v) を実行すると10回、 v が表示されない LinearLayout 内 。追加した元のアイテムをxmlに表示するだけで、 LinearLayout レンダリングしていました。

SimplePDFSaver.java:

<前>ウィズウィズ

simple_pdf_example.xml

<前>ウィズウィズ

Printed_order_element2.xml:

<前>ウィズウィズ

これは私が得るものです:

package com.mypackage.example; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.FileProvider; import android.content.Intent; import android.graphics.pdf.PdfDocument; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import java.io.File; import java.io.FileOutputStream; public class SimplePDFSaver extends AppCompatActivity { private static final String TAG = "SimplePDFSaver"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_pdfsaver); generatePDF(); } public void generatePDF() { LayoutInflater inflater = getLayoutInflater(); View pdfLayout = inflater.inflate(R.layout.simple_pdf_example, findViewById(android.R.id.content), false); int sizeSpec = View.MeasureSpec.makeMeasureSpec(2480, View.MeasureSpec.EXACTLY); int sizeSpec2 = View.MeasureSpec.makeMeasureSpec(3508, View.MeasureSpec.EXACTLY); pdfLayout.measure(sizeSpec, sizeSpec2); int width = pdfLayout.getMeasuredWidth(); int height = pdfLayout.getMeasuredHeight(); pdfLayout.layout(0, 0, width, height); LinearLayout linearLayoutView = pdfLayout.findViewById(R.id.linearLayoutView); for (int i=0; i<10; i++) { View v = getLayoutInflater().inflate(R.layout.printed_order_element2, null); linearLayoutView.addView(v); } Runnable r = new Runnable() { @Override public void run() { PdfDocument document = new PdfDocument(); PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2480, 3508, 0).create(); PdfDocument.Page page = document.startPage(pageInfo); pdfLayout.draw(page.getCanvas()); document.finishPage(page); FileOutputStream outStream; File file = new File(getExternalFilesDir(null), "file.pdf"); try { outStream = new FileOutputStream(file); document.writeTo(outStream); document.close(); outStream.flush(); outStream.getFD().sync(); outStream.close(); Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri = FileProvider.getUriForFile(SimplePDFSaver.this, BuildConfig.APPLICATION_ID + ".provider", file); intent.setDataAndType(uri, "application/pdf"); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent); } catch (Exception e) { e.printStackTrace(); Log.d(TAG, e.toString()); } } }; new Thread(r).start(); } }
あなたの答え
  • 解決した方法 # 1

    問題はコードのこのセクションにあると思います:

    ウィズウィズ ウィズウィズ

    コードの残りの部分はすべて、この膨張した

    を使用します
     見る:

    ウィズウィズ ウィズウィズ
    ウィズウィズ ウィズウィズ

    問題は、あなたの public void generatePDF() { LayoutInflater inflater = getLayoutInflater(); View pdfLayout = inflater.inflate(R.layout.simple_pdf_example, findViewById(android.R.id.content), false);  ビューが画面に表示されることはありません。あなたの pdfLayout  

    を呼び出す
     別のレイアウトを膨らませ、膨らんだ
    LinearLayout linearLayoutView = pdfLayout.findViewById(R.id.linearLayoutView);
    for (int i=0; i<10; i++) {
        View v = getLayoutInflater().inflate(R.layout.printed_order_element2, null);
        linearLayoutView.addView(v);
    }
    
     どのビューにもアタッチされません!

    あなたが

    を呼び出すとき
     そして
    pdfLayout.draw(page.getCanvas());
    を渡します
     3番目の引数として、システムに2番目の引数(
    pdfLayout
    
    )親としてのみ 
    setContentView()
    を解析するため
     インフレートされたレイアウトのルート上。膨張したレイアウトは親に追加されません!手動で
    onCreate()
    を呼び出す必要があります
     インフレータブルビュー。


    それを修正するには?いくつか質問があるので、正確に言うのは難しいです。しかし、おそらく質問をするだけで答えが明らかになるでしょう。

    見るのはおかしいどちらも  pdfLayout への呼び出し  そして inflate(int, View, boolean) への呼び出し  それは false を渡します  親として。 View に電話していただけませんか  あなたの LayoutParams で 、そして2番目の parent.addView() を避けます  一緒に電話しますか?

    もしそうなら、あなたは setContentView() へのすべての呼び出しを置き換えます  直接 inflate()  呼び出し(以前は android.R.id.content だったため  これで、アクティビティのメインコンテンツになります)。

  • 解決した方法 # 2

    あなたのlinearLayoutViewはpdfLayoutにありますが、pdfLayoutを膨らませるとき、それを親に追加しません。この方法を試してください:

    <前>ウィズウィズ

  • 解決した方法 # 3

    単に追加する

    <前>ウィズウィズ

    setContentView(R.layout.simple_pdf_example) の後  ループはすべてを修正しました。 Ben Pに感謝します。https://stackoverflow.com/users/8298909/ben-p

    問題は、レイアウトを測定する必要があるか、layout()を実行する必要があることです。確かではありませんが、それはそれと関係があります。 2行が必要かどうかはわかりませんが、1行だけを使用して何が機能するかを確認できます

    onCreate()

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ opentracing - jaegerトレースIDとスパンIDをlog4j2ログに追加します