В моем проекте пользователям предоставляется действие «Создать», которое содержит текст или изображения 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;
}