Я пытаюсь сохранить imagePath с комнатой Android.Итак, у меня есть две действия, во-первых, это место, где все выбранные изображения отображаются в RecycleView, а во-вторых, где пользователь может нажать на заполнитель изображения, а затем выбрать изображение из галереи. И изображение остается после того, как он вернулся. Затем нажмите СохранитьFOB и вернитесь к первому действию. Если пользователь захочет заменить, он нажмет на изображение в режиме повторного просмотра и снова коснется предварительно выбранного изображения и снова выберет другое из галереи.Проблема в том, что хотя выбранное изображение остается сохраненным во втором упражнении, в первом действии не отображаются никакие изображения. Только пробел. Если я коснусь места, где должно остаться изображение, оно переключит меня на второе занятие. Так что изображение естьпросто не появляется.
Я пробовал это решение, но оно помогло мне только частично
первый класс:
public class MainActivity extends AppCompatActivity {
private ImageViewModel imageViewModel;
private FloatingActionButton floatingActionButton;
private String imagePath;
public static final int ADD_IMAGE_REQUEST = 1;
public static final int EDIT_IMAGE_REQUEST = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
if (getIntent() != null) {
imagePath = getIntent().getStringExtra(EXTRA_IMAGE);
}
final ImageAdapter imageAdapter = new ImageAdapter(this);
recyclerView.setAdapter(imageAdapter);
imageViewModel = ViewModelProviders.of(this).get(ImageViewModel.class);
imageViewModel.getAllImages().observe(this, new Observer<List<ImageEntity>>() {
@Override
public void onChanged(List<ImageEntity> imageEntities) {
imageAdapter.setImages(imageEntities);
}
});
floatingActionButton = findViewById(R.id.fob);
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddEditActivity.class);
intent.putExtra("whichRequest", ADD_IMAGE_REQUEST);
startActivity(intent);
finish();
}
});
imageAdapter.setOnClickListener(new ImageAdapter.OnItemClickListener() {
@Override
public void onItemClicked(ImageEntity imageEntity) {
Intent intent = new Intent(MainActivity.this, AddEditActivity.class);
intent.putExtra(AddEditActivity.EXTRA_ID, imageEntity.getId());
intent.putExtra(EXTRA_IMAGE, imageEntity.getImgePath());
intent.putExtra("whichRequest", EDIT_IMAGE_REQUEST);
startActivity(intent);
}
});
}
второй класс:
public class AddEditActivity extends AppCompatActivity {
public static final String EXTRA_IMAGE = "package com.example.imagesaver.EXTRA_IMAGE";
public static final String EXTRA_ID = "package com.example.imagesaver.EXTRA_ID";
public static final int PICK_IMAGE = 1;
private String imageUriString;
private ImageView imageView;
private FloatingActionButton floatingActionButton;
private Uri selectedImageUri;
private int imageId;
private int whichREquest;
private ImageViewModel imageViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_edit_layout);
imageView = findViewById(R.id.image);
imageViewModel = ViewModelProviders.of(this).get(ImageViewModel.class);
Intent intent = getIntent();
if (getIntent() != null) {
imageUriString = getIntent().getStringExtra(EXTRA_IMAGE);
imageId = getIntent().getIntExtra(EXTRA_ID, 0);
whichREquest = getIntent().getIntExtra("whichRequest", 0);
}
if (intent.hasExtra(EXTRA_ID)) {
setTitle("Edit");
imageView.setImageURI(Uri.parse(imageUriString));
} else {
setTitle("Add");
invalidateOptionsMenu();
}
floatingActionButton = findViewById(R.id.fob_save);
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveImage();
}
});
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_OPEN_DOCUMENT );
startActivityForResult(Intent.createChooser(intent, "select a picture"), PICK_IMAGE);
Toast.makeText(AddEditActivity.this, "izaberi jednu sliku", Toast.LENGTH_SHORT).show();
}
});
}
private void saveImage() {
if (whichREquest == 1){
ImageEntity imageEntity = new ImageEntity(selectedImageUri.toString());
imageViewModel.insert(imageEntity);
Toast.makeText(this, "Note is saved", Toast.LENGTH_SHORT).show();
}else {
if (imageId == -1) {
Toast.makeText(this, "Note can not be updated", Toast.LENGTH_SHORT).show();
return;
}
ImageEntity imageEntity = new ImageEntity(selectedImageUri.toString());
imageEntity.setId(imageId);
imageViewModel.update(imageEntity);
Toast.makeText(this, "Note is updated", Toast.LENGTH_SHORT).show();
}
Intent intent = new Intent(AddEditActivity.this, MainActivity.class);
int id = getIntent().getIntExtra(EXTRA_ID, -1);
//ovde proveravamo da id nije -1.
//samo ako je to istina onda stavljamo id
if (id != -1) {
intent.putExtra(EXTRA_ID, id);
}
startActivity(intent);
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) {
selectedImageUri = data.getData();
imageUriString = selectedImageUri.toString();
imageView.setImageURI(selectedImageUri);
}
}
}
мой класс адаптера:
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {
private List<ImageEntity> listaSlika = new ArrayList<>();
private Context context;
private OnItemClickListener listener;
public ImageAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.single_item, parent, false);
return new ImageViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
ImageEntity currentNote = listaSlika.get(position);
holder.imageView.setImageURI(Uri.parse(new File(currentNote.getImgePath()).toString()));
Glide.with(context)
.load(new File(currentNote.getImgePath()).toString())
.into(holder.imageView);
}
public void setImages(List<ImageEntity> listaSlika) {
this.listaSlika = listaSlika;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return listaSlika.size();
}
//predstvalja poziciju
public ImageEntity getImaageAtPosition(int position){
//vraca poziciju itema
return listaSlika.get(position);
}
public class ImageViewHolder extends RecyclerView.ViewHolder{
private ImageView imageView;
public ImageViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.single_image_item);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (listener!=null && position!=RecyclerView.NO_POSITION){
listener.onItemClicked(listaSlika.get(position));
}
}
});
}
}
public interface OnItemClickListener{
void onItemClicked(ImageEntity imageEntity);
}
public void setOnClickListener(OnItemClickListener listener){
this.listener = listener;
}
}
мой logcat:
W/Glide: Load failed for content:/com.android.providers.media.documents/document/image%3A665917 with size [159x1920]
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
There were 3 causes:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, LOCAL
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917
Cause (2 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.os.ParcelFileDescriptor, LOCAL
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917
Cause (3 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.content.res.AssetFileDescriptor, LOCAL
There was 1 cause:
java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917