我的片段在重新创建后不会被破坏

时间:2017-07-23 04:43:29

标签: android android-fragments

我正在开发一个图库应用程序,我将外部存储中的所有图标显示到我的应用程序中。我按照以下链接中的教程进行操作。

https://deepshikhapuri.wordpress.com/2017/03/20/get-all-images-from-gallery-in-android-programmatically/

现在,除此之外,我还为用户提供了一个选项,可以从应用程序中拍摄照片并将其保存到图库中。使用相机意图拍摄照片时,图像实际保存在图库中。但我不得不想要另一个片段并回到画廊看我拍的照片。

要立即查看相关意图的onActivityResult(),我正在重新创建片段。但是当我们单击后退按钮时会出现问题。重新创建的片段永远留在后台。我大脑褪色寻找答案。任何帮助表示赞赏。

请在下面找到我到目前为止所尝试的内容。

public class GalleryFragment extends Fragment {

Toolbar toolbar;
MenuItem search;
public static ArrayList<Model_images> al_images = new ArrayList<>();
boolean boolean_folder;
Adapter_PhotosFolder obj_adapter;
GridView gv_folder;
FloatingActionButton cameraButton;
private static final int REQUEST_PERMISSIONS = 100;
static final int REQUEST_TAKE_PHOTO = 1;
static final int REQUEST_IMAGE_CAPTURE = 1;

String projectName = "ProjectGA";
File directory;
String mCurrentPhotoPath;

List<GridViewItem> gridItems;
GridView gridView;

public static GalleryFragment newInstance(){
    GalleryFragment galleryFragment = new GalleryFragment();
    return galleryFragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    directory = new File(Environment.getExternalStorageDirectory() + projectName);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_gallery, container, false);
    toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
    ImageView icon = (ImageView) getActivity().findViewById(R.id.toolbarIcon);
    icon.setImageResource(R.drawable.ic_perm_media_black_24dp);
    icon.setColorFilter(getResources().getColor(R.color.Gallery));
    TextView title = (TextView) getActivity().findViewById(R.id.toolbarTitle);
    title.setText(getString(R.string.galleryLabel));
    title.setTextColor(getResources().getColor(R.color.textInputEditTextColor));
    toolbar.setBackground(getResources().getDrawable(R.drawable.tile_green));
    toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_menu_green_24dp));
    cameraButton = (FloatingActionButton) getActivity().findViewById(R.id.rightActionButton);
    cameraButton.setVisibility(View.VISIBLE);

    cameraButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dispatchTakePictureIntent();
        }
    });

    //gridView = (GridView) view.findViewById(R.id.gridView);


    gv_folder = (GridView)view.findViewById(R.id.gv_folder);
    gv_folder.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Intent intent = new Intent(getContext(), PhotosActivity.class);
            intent.putExtra("value",i);
            startActivity(intent);
        }
    });

    if ((ContextCompat.checkSelfPermission(getContext(),
            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(getContext(),
            Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
        if ((ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) && (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                Manifest.permission.READ_EXTERNAL_STORAGE))) {

        } else {
            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_PERMISSIONS);
        }
    }else {
        Log.e("Else","Else");
        fn_imagespath();
    }

    setHasOptionsMenu(true);

    return view;
}

@Override
public void onDestroyView() {
    cameraButton.setVisibility(View.INVISIBLE);
    super.onDestroyView();
}


private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {photoFile = createImageFile();

        } catch (IOException ex) {

            Context context = getContext();
            CharSequence text = "Photo cannot be stored.";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();

        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Context context = getContext();
            Uri photoURI = FileProvider.getUriForFile(context,
                    "com.example.projectga.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);

        }else{
            Context context = getContext();
            CharSequence text = "Attention! Required to take picture!!";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }
    }
}

public void createFolder(){
    if (!directory.exists()){
        directory.mkdirs();
    }

}

private File createImageFile() throws IOException {
    createFolder();
    // Create an image file name
    Context context = getContext();
    String timeStamp = new SimpleDateFormat("dd-MMM-yyyy").format(new Date());
    String imageFileName = projectName + "_" + timeStamp + "_";
    File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    addImageToGallery(image, context);

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = "file:" + image.getPath();
    return image;
}

public static void addImageToGallery(File image, final Context context) {
    ContentValues values = new ContentValues();

    values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.MediaColumns.DATA, image.toString());

    context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {

       getFragmentManager().beginTransaction()
               .replace(R.id.container_gaFragments, GalleryFragment.newInstance()).commit();

   }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    search = menu.add("search").setIcon(R.drawable.ic_search_green_24dp).setShowAsActionFlags(1);

    super.onCreateOptionsMenu(menu, inflater);
}

public ArrayList<Model_images> fn_imagespath() {
    al_images.clear();

    int int_position = 0;
    Uri uri;
    Cursor cursor;
    int column_index_data, column_index_folder_name;

    String absolutePathOfImage = null;
    uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

    String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};

    final String orderBy = MediaStore.Images.Media.DATE_TAKEN;
    cursor = getContext().getContentResolver().query(uri, projection, null, null, orderBy + " DESC");

    column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
    column_index_folder_name = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
    while (cursor.moveToNext()) {
        absolutePathOfImage = cursor.getString(column_index_data);
        Log.e("Column", absolutePathOfImage);
        Log.e("Folder", cursor.getString(column_index_folder_name));

        for (int i = 0; i < al_images.size(); i++) {
            if (al_images.get(i).getStr_folder().equals(cursor.getString(column_index_folder_name))) {
                boolean_folder = true;
                int_position = i;
                break;
            } else {
                boolean_folder = false;
            }
        }

        if (boolean_folder) {

            ArrayList<String> al_path = new ArrayList<>();
            al_path.addAll(al_images.get(int_position).getAl_imagepath());
            al_path.add(absolutePathOfImage);
            al_images.get(int_position).setAl_imagepath(al_path);

        } else {
            ArrayList<String> al_path = new ArrayList<>();
            al_path.add(absolutePathOfImage);
            Model_images obj_model = new Model_images();
            obj_model.setStr_folder(cursor.getString(column_index_folder_name));
            obj_model.setAl_imagepath(al_path);
            al_images.add(obj_model);
        }
    }

    for (int i = 0; i < al_images.size(); i++) {
        Log.e("FOLDER", al_images.get(i).getStr_folder());
        for (int j = 0; j < al_images.get(i).getAl_imagepath().size(); j++) {
            Log.e("FILE", al_images.get(i).getAl_imagepath().get(j));
        }
    }
    obj_adapter = new Adapter_PhotosFolder(getContext(),al_images);
    gv_folder.setAdapter(obj_adapter);
    return al_images;
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case REQUEST_PERMISSIONS: {
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    fn_imagespath();
                } else {
                    Toast.makeText(getContext(), "The app was not allowed to read or write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
                }
            }
        }
    }
}


@Override
public void onDestroy() {
    super.onDestroy();
}

}

我还覆盖了Activity中的onBackPressed()。请帮忙。还附上一些图像以使其清晰。

The exact problem of what is happening

感谢任何帮助。

0 个答案:

没有答案