Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何节省开支;检索图像';SaveInstanceState上的URI是多少?_Java_Android_Uri_Android Bitmap - Fatal编程技术网

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");