Drawable, прошедший через startActivityForResult, не распечатывается на странице PDF - PullRequest
1 голос
/ 07 августа 2020

В моем проекте пользователям предоставляется действие «Создать», которое содержит текст или изображения CardView для представления страниц в файле PDF. Эти страницы затем сохраняются в PDF-документ для просмотра. Однако изображения, выбранные пользователем, не печатаются внутри документа PDF. Но когда я добавляю изображение программно, оно печатается в PDF, и я не могу понять, почему выбранный пользователем не является.

Изображения вставляются через onItemClickListener в действие галереи GridView. Пользователь щелкает «Добавить изображение» в действии «Создание» и направляется в галерею GridView через startActivityForResult. Затем «щелкнутое» изображение передается как намерение действию Create через onActivityResult. Вот мой код для обоих действий.

Создание:

public class CreateActivity extends AppCompatActivity {

//firebase auth
private FirebaseAuth mAuth = FirebaseAuth.getInstance();

//public variables
public String currentUserAccount;
public String teacherAccountNav = "Teacher";
public String currentUserId;

ViewPager viewPager;
CreateAdapter createAdapter;
List<PdfPage> pdfPageList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create);

    currentUserId = mAuth.getCurrentUser().getUid();

    //image added PROGRAMMATICALLY test
    pdfPageList.add(new PdfPage("", "Image", R.drawable.a_blues_scale_android, "Scale"));

}

@Override
protected void onStart() {
    super.onStart();

    createAdapter = new CreateAdapter(pdfPageList, this);

    viewPager = findViewById(R.id.viewPager);
    viewPager.setAdapter(createAdapter);
    viewPager.setPadding(130, 0, 130, 0);

    createAdapter.setOnItemClickListener(new CreateAdapter.onItemClickListener() {
        @Override
        public void onEditClick(int position) {
            AlertDialog.Builder builder = new AlertDialog.Builder(CreateActivity.this);
            LayoutInflater inflater = getLayoutInflater();
            final View dialogView = inflater.inflate(R.layout.add_text_dialog, null);
            builder.setView(dialogView);

            final EditText enterText = dialogView.findViewById(R.id.addTextEditText);
            final Button addTextButton = dialogView.findViewById(R.id.addNewTextButton);

            final PdfPage pdfPage = pdfPageList.get(position);

            enterText.setText(pdfPage.getPageText());

            final AlertDialog alertDialog = builder.create();
            alertDialog.show();

            addTextButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    pdfPage.setPageText(enterText.getText().toString().trim());

                    Toast.makeText(CreateActivity.this, "Text Page Edited", Toast.LENGTH_SHORT).show();

                    alertDialog.dismiss();
                    onStart();
                }
            });


        }

        @Override
        public void onDeleteClick(int position) {
            pdfPageList.remove(position);
            Toast.makeText(CreateActivity.this, "Page Deleted", Toast.LENGTH_SHORT).show();
            onStart();
        }
    });
}

public void onAddImageClick(View view){
    showAddImageDialog();
}

private void showAddImageDialog(){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    LayoutInflater inflater = getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.image_gallery_selection_dialog, null);
    builder.setView(dialogView);

    final Button buttonChord = dialogView.findViewById(R.id.chordButton);
    final Button buttonScale = dialogView.findViewById(R.id.scaleButton);

    final AlertDialog alertDialog = builder.create();
    alertDialog.show();

    buttonChord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(CreateActivity.this, ChordGalleryActivity.class);
            //startActivity for result
            startActivityForResult(intent, 2);
            alertDialog.dismiss();
        }
    });

    buttonScale.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==2) {
        if (resultCode == 2) {
            PdfPage pdfPage = new PdfPage();

            assert data != null;
            pdfPage.setPageImage(data.getIntExtra("DIAGRAM_RES", 0));
            pdfPage.setImageType(data.getStringExtra("DIAGRAM_TYPE"));
            pdfPage.setPageType("Image");
            pdfPage.setPageText("");


            pdfPageList.add(pdfPage);
            Toast.makeText(CreateActivity.this, "Image Page Added", Toast.LENGTH_SHORT).show();

            onStart();
        } else if (resultCode == 1) {
            //result from back button
            onStart();
        }
    }
}

public void onSaveClicked(View view){
    showSaveDialog();
}

private void showSaveDialog(){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    LayoutInflater inflater = getLayoutInflater();

    //dialog XML
    final View dialogView = inflater.inflate(R.layout.save_pdf_dialog,null);

    builder.setView(dialogView);

    final EditText enterFileName = dialogView.findViewById(R.id.pdfNameEditText);
    final ImageButton buttonNo = dialogView.findViewById(R.id.imageButtonNo4);
    final ImageButton buttonYes = dialogView.findViewById(R.id.imageButtonYes4);

    final AlertDialog alertDialog = builder.create();
    alertDialog.show();

    buttonNo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alertDialog.dismiss();
        }
    });

    buttonYes.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        @Override
        public void onClick(View v) {
            String fileName = enterFileName.getText().toString().trim();

            //PDF Document creation
            PdfDocument pdfDocument = new PdfDocument();

            //for loop for arrayList new page
            int i = 0;
            for(PdfPage userDoc : pdfPageList){

                userDoc.getPageType();
                userDoc.getPageText();
                userDoc.getPageImage();
                userDoc.getImageType();

                //write text to page if page type is "Text"
                if(userDoc.getPageType().equals("Text")){
                    //create a page info description
                    PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(900, 1280, i+1).create();

                    //start a page
                    PdfDocument.Page page = pdfDocument.startPage(pageInfo);

                    //writing to new page
                    Paint paint = new Paint();

                    //setting font and text size
                    paint.setTextSize(26);
                    paint.setTypeface(Typeface.create("Arial", Typeface.NORMAL));

                    //canvas used to write to page, getting object data from inputted text
                    String myString = userDoc.getPageText();

                    //setting where to start text on the page
                    int x = 10, y = 25;
                    //multi line loop
                    for(String line : myString.split("\n")){
                        page.getCanvas().drawText(line, x, y, paint);
                        y+=paint.descent()-paint.ascent();
                    }
                    //finish page
                    pdfDocument.finishPage(page);

                    //add to page count
                    i++;
                }else if(userDoc.getPageType().equals("Image")){ //write to page if page type is "Image"
                    //create a page info description
                    PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(900, 1280, i+1).create();

                    //start a page
                    PdfDocument.Page page = pdfDocument.startPage(pageInfo);

                    //writing to new page
                    Paint paint = new Paint();

                    //this gets the resource files bitmap
                    int imageFile = userDoc.getPageImage();
                    Bitmap image = BitmapFactory.decodeResource(getResources(), imageFile);

                    //writing image to page
                    if(userDoc.getImageType() == "Scale") {
                        page.getCanvas().drawBitmap(image, 0, 250, paint);
                    }else if(userDoc.getImageType() == "Chord"){
                        page.getCanvas().drawBitmap(image, 250, 250, paint);
                    }

                    //finish page
                    pdfDocument.finishPage(page);

                    //add to page count
                    i++;
                }
            }

            String folder_main = "/GuitarAppStorage";

            //get or create parent folder for app
            String rootPath = String.valueOf(Environment.getExternalStorageDirectory());
            File parentFolder = new File(rootPath + folder_main);
            if(!parentFolder.exists()){
                parentFolder.mkdirs();
            }

            //get or create child folder with currentUserId as folder name
            File childFolder = new File(rootPath + folder_main, currentUserId);
            if(!childFolder.exists()){
                childFolder.mkdirs();
            }

            //new file with path and filename
            File file = new File(childFolder, fileName+".pdf");

            //write to folder
            try{
                pdfDocument.writeTo(new FileOutputStream(file));
                Toast.makeText(CreateActivity.this, "File Created", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(CreateActivity.this, "Error: File not created", Toast.LENGTH_SHORT).show();
            }

            alertDialog.dismiss();
            onStart();

        }
    });
}

Действие галереи:

public class ChordGalleryActivity extends AppCompatActivity {

private List<Diagram> diagramList = new ArrayList<>();
GridView gridView;
DiagramAdapter diagramAdapter;
SearchView searchView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chord_gallery);

    //add chords to diagram list
    diagramList.add(new Diagram("C Major", "Chord", R.drawable.cmajor_android));
    diagramList.add(new Diagram("C Minor", "Chord", R.drawable.cm_android));
    diagramList.add(new Diagram("C# Minor", "Chord", R.drawable.c_sharp_m_android));
    diagramList.add(new Diagram("Db Major", "Chord", R.drawable.db_android));
    diagramList.add(new Diagram("D Major", "Chord", R.drawable.d_android));
    diagramList.add(new Diagram("D Minor", "Chord", R.drawable.dm_android));
    diagramList.add(new Diagram("Eb Major", "Chord", R.drawable.e_flat_android));
    diagramList.add(new Diagram("E Major", "Chord", R.drawable.e_android));
    diagramList.add(new Diagram("E Minor", "Chord", R.drawable.em_android));
    diagramList.add(new Diagram("F Major", "Chord", R.drawable.f_android));
    diagramList.add(new Diagram("F Minor", "Chord", R.drawable.fm_android));
    diagramList.add(new Diagram("F# Major", "Chord", R.drawable.f_sharp__android));
    diagramList.add(new Diagram("F# Minor", "Chord", R.drawable.f_sharp_m_android));
    diagramList.add(new Diagram("G Major", "Chord", R.drawable.g_android));
    diagramList.add(new Diagram("G Minor", "Chord", R.drawable.gm_android));
    diagramList.add(new Diagram("G# Minor", "Chord", R.drawable.g_sharp_m_android));
    diagramList.add(new Diagram("Ab Major", "Chord", R.drawable.a_flat_android));
    diagramList.add(new Diagram("A Major", "Chord", R.drawable.a_android));
    diagramList.add(new Diagram("A Minor", "Chord", R.drawable.am_android));
    diagramList.add(new Diagram("Bb Major", "Chord", R.drawable.b_flat_android));
    diagramList.add(new Diagram("Bb Minor", "Chord", R.drawable.bbm_android));
    diagramList.add(new Diagram("B Major", "Chord", R.drawable.b_android));
    diagramList.add(new Diagram("B Minor", "Chord", R.drawable.bm_android));

    //initialise views
    gridView = findViewById(R.id.gridView);
    searchView = findViewById(R.id.searchView);

    //set adapter
    diagramAdapter = new DiagramAdapter(diagramList, this);

    //set adapter to gridView
    gridView.setAdapter(diagramAdapter);

    //click listeners go here
    diagramAdapter.setOnItemClickListener(new DiagramAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            final Diagram diagram = diagramList.get(position);

            int res = diagram.getDiagramRes();
            String type = diagram.getDiagramType();

            Intent intent = new Intent();
            intent.putExtra("DIAGRAM_RES", res);
            intent.putExtra("DIAGRAM_TYPE", type);
            setResult(2, intent);
            finish();

        }
    });

У меня есть модель «Диаграмма», которая содержит данные объекта для изображений и модель «PdfPage», которая содержит данные объекта для новых добавленных страниц. Вот код для моих моделей.

Модель диаграммы (изображение):

public class Diagram {
private String diagramName;
private String diagramType;
private int diagramRes;

public Diagram() {
}

public Diagram(String diagramName, String diagramType, int diagramRes) {
    this.diagramName = diagramName;
    this.diagramType = diagramType;
    this.diagramRes = diagramRes;
}

public String getDiagramName() {
    return diagramName;
}

public void setDiagramName(String diagramName) {
    this.diagramName = diagramName;
}

public String getDiagramType() {
    return diagramType;
}

public void setDiagramType(String diagramType) {
    this.diagramType = diagramType;
}

public int getDiagramRes() {
    return diagramRes;
}

public void setDiagramRes(int diagramRes) {
    this.diagramRes = diagramRes;
}

Модель PdfPage:

public class PdfPage {
private String pageText;
private String pageType;
private int pageImage;
private String imageType;

public PdfPage() {
}

public PdfPage(String pageText, String pageType, int pageImage, String imageType) {
    this.pageText = pageText;
    this.pageType = pageType;
    this.pageImage = pageImage;
    this.imageType = imageType;
}

public String getPageText() {
    return pageText;
}

public void setPageText(String pageText) {
    this.pageText = pageText;
}

public String getPageType() {
    return pageType;
}

public void setPageType(String pageType) {
    this.pageType = pageType;
}

public int getPageImage() {
    return pageImage;
}

public void setPageImage(int pageImage) {
    this.pageImage = pageImage;
}

public String getImageType() {
    return imageType;
}

public void setImageType(String imageType) {
    this.imageType = imageType;
}

Добавленное изображение появляется в моем Create Activity CardView, который предполагает, что Intent putExtra сработал, но когда я сохраняю документ PDF и открываю его, изображение не распечатывается в PDF, но есть новая пустая страница. Когда я программно добавляю новое изображение в onCreate, оно распечатывается в PDF и может быть просмотрено в документе PDF. Почему выбранные пользователем изображения не печатаются в PDF-документе, а изображения, добавленные мной программно, печатаются?

Вот мои адаптеры для справки.

CreateAdapter:

public class CreateAdapter extends PagerAdapter {

private List<PdfPage> pagesList;
private LayoutInflater layoutInflater;
private Context context;
private onItemClickListener mListener;

public interface onItemClickListener{
    //click method for edit button
    void onEditClick(int position);
    //click method for delete button
    void onDeleteClick(int position);
}

public void setOnItemClickListener(onItemClickListener listener){
    mListener = listener;
}

public CreateAdapter(List<PdfPage> pagesList, Context context) {
    this.pagesList = pagesList;
    this.context = context;
}

@Override
public int getCount() {
    return pagesList.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view.equals(object);
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position) {
    layoutInflater = LayoutInflater.from(context);
    View view = null;

    if(pagesList.get(position).getPageType() == "Text") {
        view = layoutInflater.inflate(R.layout.create_text_cardview, container, false);

        TextView inputText = view.findViewById(R.id.inputTextView);
        ImageButton editButton = view.findViewById(R.id.imageButtonEdit);
        ImageButton deleteButton = view.findViewById(R.id.imageButtonDelete);
        
        inputText.setText(pagesList.get(position).getPageText());

        //edit click listener
        editButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null){
                    int position2 = pagesList.indexOf(pagesList.get(position));
                    mListener.onEditClick(position2);
                }
            }
        });

        //delete click listener
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null){
                    int position3 = pagesList.indexOf(pagesList.get(position));
                    mListener.onDeleteClick(position3);
                }
            }
        });

        container.addView(view, 0);


    }else if(pagesList.get(position).getPageType() == "Image"){
        view = layoutInflater.inflate(R.layout.create_image_cardview, container, false);

        ImageView inputImage = view.findViewById(R.id.inputImageView);
        ImageButton deleteButton = view.findViewById(R.id.imageButtonDelete);

        //image getter
        inputImage.setImageResource(pagesList.get(position).getPageImage());

        //delete click listener
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null){
                    int position4 = pagesList.indexOf(pagesList.get(position));
                    mListener.onDeleteClick(position4);
                }
            }
        });

        container.addView(view, 0);
    }

    assert view != null;
    return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((View)object);
}

Схема Адаптер:

public class DiagramAdapter extends BaseAdapter {

private List<Diagram> list;
private Context context;
private OnItemClickListener mListener;

public interface OnItemClickListener{
    void onItemClick(int position);
}

public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

public DiagramAdapter(List<Diagram> list, Context context) {
    this.list = list;
    this.context = context;
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    Diagram diagram = list.get(position);

    View view = convertView;

    if (view == null) {
        view = LayoutInflater.from(context).inflate(R.layout.diagram_card_view, parent, false);
    }

    ImageView diagramImage = view.findViewById(R.id.diagramImageView);
    TextView diagramName = view.findViewById(R.id.diagramNameTextView);

    int image = diagram.getDiagramRes();
    String name = diagram.getDiagramName();

    diagramImage.setImageResource(image);
    diagramName.setText(name);

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null){
                int position2 = list.indexOf(list.get(position));
                mListener.onItemClick(position2);
            }
        }
    });

    return view;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...