Java 如何节省开支;检索图像';SaveInstanceState上的URI是多少?
我正在努力改变方向。目前,当我旋转手机时,我片段中的图像消失了。这显然是因为活动已被销毁并重新创建。我没有像保存图像那样保存如此大的数据,而是决定在Java 如何节省开支;检索图像';SaveInstanceState上的URI是多少?,java,android,uri,android-bitmap,Java,Android,Uri,Android Bitmap,我正在努力改变方向。目前,当我旋转手机时,我片段中的图像消失了。这显然是因为活动已被销毁并重新创建。我没有像保存图像那样保存如此大的数据,而是决定在onSaveInstanceState方法中保存图像的Uri: @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putParce
onSaveInstanceState
方法中保存图像的Uri
:
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("imageUri", imageUri);
}
在我的片段的onCreateView
中,我试图检索Uri并将其粘贴回ImageView
中,同时考虑到空的可能性
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_top_image, container, false);
imageView = view.findViewById(R.id.meme_image_view);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectedImage(v);
}
});
topTextView = view.findViewById(R.id.top_text_view);
bottomTextView = view.findViewById(R.id.bottom_text_view);
if(savedInstanceState != null){
if(imageUri != null){
Uri savedUri = savedInstanceState.getParcelable("imageUri");
imageView.setImageURI(savedUri);
}
}
return view;
}
由于某种原因,它不起作用。当我旋转手机时,图像仍然丢失
完整片段:
public class TopImageFragment extends Fragment {
ImageView imageView;
TextView topTextView, bottomTextView;
public static final int PICK_IMAGE = 1;
Uri imageUri;
int counter = 0;
String timeStamp = new SimpleDateFormat("yyyyMMdd").format(new Date());
MemeViewModel memeViewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_top_image, container, false);
imageView = view.findViewById(R.id.meme_image_view);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectedImage(v);
}
});
topTextView = view.findViewById(R.id.top_text_view);
bottomTextView = view.findViewById(R.id.bottom_text_view);
if(savedInstanceState != null){
Uri savedUri = savedInstanceState.getParcelable("imageUri");
imageView.setImageURI(savedUri);
}
return view;
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("imageUri", imageUri);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
memeViewModel = ViewModelProviders.of(Objects.requireNonNull(getActivity())).get(MemeViewModel.class);
memeViewModel.getTopText().observe(getViewLifecycleOwner(), new Observer<CharSequence>() {
@Override
public void onChanged(@Nullable CharSequence charSequence) {
topTextView.setText(charSequence);
}
});
memeViewModel.getBottomText().observe(getViewLifecycleOwner(), new Observer<CharSequence>() {
@Override
public void onChanged(@Nullable CharSequence charSequence) {
bottomTextView.setText(charSequence);
}
});
}
public void selectedImage(View v) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(intent, PICK_IMAGE);
}
public void createBitmapAndSave(ImageView img) {
BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());
Bitmap bitmap = bitmapDrawable.getBitmap();
Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
String topText = topTextView.getText().toString();
String bottomText = bottomTextView.getText().toString();
Canvas canvas = new Canvas(mutableBitmap);
TextPaint topPaint = new TextPaint();
TextPaint bottomPaint = new TextPaint();
Typeface typeface = getResources().getFont(R.font.impact);
topPaint.setColor(Color.WHITE);
topPaint.setStyle(Paint.Style.FILL);
topPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
topPaint.setTextSize(topTextView.getTextSize());
topPaint.setTypeface(typeface);
bottomPaint.setColor(Color.WHITE);
bottomPaint.setStyle(Paint.Style.FILL);
bottomPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
bottomPaint.setTextSize(bottomTextView.getTextSize());
bottomPaint.setTypeface(typeface);
float topTextMeasurement = topPaint.measureText(topText);
float bottomTextMeasurement = bottomPaint.measureText(bottomText);
StaticLayout topLayout = new StaticLayout(topText, topPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0f,
0.0f, false);
StaticLayout bottomLayout = new StaticLayout(bottomText, bottomPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER,
1.0f, 0.0f, false);
canvas.translate(0,0);
topLayout.draw(canvas);
canvas.translate(0, canvas.getHeight() - 210);
bottomLayout.draw(canvas);
counter++;
File file;
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
file = new File(path + "/SimpliMeme/" + timeStamp + "-" + counter + ".jpg");
file.getParentFile().mkdir();
try {
OutputStream stream = new FileOutputStream(file);
mutableBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.flush();
stream.close();
Toast.makeText(getContext(), "Top Text: " + String.valueOf(topTextMeasurement) + " and bottom text: " + String.valueOf(bottomTextMeasurement),
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) {
imageUri = Objects.requireNonNull(data).getData();
imageView.setImageURI(imageUri);
memeViewModel.setSharedId(imageUri.getLastPathSegment());
}
}
@Override
public void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(listener, new IntentFilter("CUSTOM_ACTION"));
}
private BroadcastReceiver listener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("DATA");
createBitmapAndSave(imageView);
}
};
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(listener);
}
}
替换:
outState.putString(String.valueOf(imageUri), "imageUri");
与:
并替换:
String raw = savedInstanceState.getString("imageUri");
Uri savedUri = Uri.parse(raw);
与:
Bundle
上的put…()
方法获取键,后跟值。您有值,后跟键。而且,对于Uri
,您不需要将其转换为String
,不起作用。我已经添加了您的更改,但图像在旋转更改时未保存。@AndrosAdrianopolos:检查以确认您是否从包中获取Uri
。您可能需要去掉if(imageUri!=null)
检查,因为在新活动实例中设置imageUri
的值之前,您正在执行该检查。我有一个全局Uri imageUri
,它没有初始化。当用户调用处理图像选择和编辑的其他方法时,它将被初始化。我将发布我的完整类来展示我所谈论的内容。因此,有一个变化,即在创建片段时,它采用了一个空Uri。@AndrosAdrianopolos:“我有一个全局Uri imageUri”--不,您没有。在TopImageFragment
Java类中有一个字段。当屏幕旋转时,您会看到一个全新的TopImageFragment
实例。在这种情况下,imageUri
是null
,这就是为什么需要在包中查找它。但是,您没有在包中查找它,因为您有if(imageUri!=null)
检查。如果(imageUri!=null)
,请删除,或者至少将其移动到设置imageUri
的位置之后。
outState.putParcelable("imageUri", imageUri);
String raw = savedInstanceState.getString("imageUri");
Uri savedUri = Uri.parse(raw);
Uri savedUri = savedInstanceState.getParcelable("imageUri");