2017-07-21 39 views
0

我從片段之一調用Camera Intent將圖像保存到圖庫中。照片拍攝後,圖像也被保存在畫廊中。我也有一個適配器,它使用GridView將存儲在圖庫中的所有圖像存入我的應用程序中。因此,在從Camera Intent拍攝照片後,我必須返回到另一個片段,然後返回以查看GridView中刷新的照片。所以基本上,一旦我從Camera Intent返回,我想刷新片段。在Camera Intent後刷新片段

這是結構。我有一個名爲GalleryHomeFragment的片段,我從中點擊一個按鈕並轉到GalleryFragment。從那裏,我打電話給相機意圖。我的要求是刷新GalleryFragment,一旦我從照片中回來,看到我的文件夾中的圖片。

這是我到目前爲止嘗試過的。發佈必要的代碼。

GalleryFragment.java

cameraButton = (FloatingActionButton) view.findViewById(R.id.cameraBtn); 

    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; 
} 

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 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(); 
       } 
      } 
     } 
    } 
} 

GridViewAdapter.java

Context context; 
ViewHolder viewHolder; 
ArrayList<Model_images> al_menu = new ArrayList<>(); 
int int_position; 


public GridViewAdapter(Context context, ArrayList<Model_images> al_menu,int int_position) { 
    super(context, R.layout.adapter_photosfolder, al_menu); 
    this.al_menu = al_menu; 
    this.context = context; 
    this.int_position = int_position; 


} 

@Override 
public int getCount() { 

    Log.e("ADAPTER LIST SIZE", al_menu.get(int_position).getAl_imagepath().size() + ""); 
    return al_menu.get(int_position).getAl_imagepath().size(); 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

@Override 
public int getViewTypeCount() { 
    if (al_menu.get(int_position).getAl_imagepath().size() > 0) { 
     return al_menu.get(int_position).getAl_imagepath().size(); 
    } else { 
     return 1; 
    } 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 


@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 

     viewHolder = new ViewHolder(); 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.adapter_photosfolder, parent, false); 
     viewHolder.tv_foldern = (TextView) convertView.findViewById(R.id.tv_folder); 
     viewHolder.tv_foldersize = (TextView) convertView.findViewById(R.id.tv_folder2); 
     viewHolder.iv_image = (ImageView) convertView.findViewById(R.id.iv_image); 


     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    viewHolder.tv_foldern.setVisibility(View.GONE); 
    viewHolder.tv_foldersize.setVisibility(View.GONE); 



    Glide.with(context).load("file://" + al_menu.get(int_position).getAl_imagepath().get(position)) 
      .diskCacheStrategy(DiskCacheStrategy.NONE) 
      .skipMemoryCache(true) 
      .into(viewHolder.iv_image); 


    return convertView; 

} 

private static class ViewHolder { 
    TextView tv_foldern, tv_foldersize; 
    ImageView iv_image; 
} 
} 

Adapter_PhotosFolder.java

Context context; 
ViewHolder viewHolder; 
ArrayList<Model_images> al_menu = new ArrayList<>(); 
int int_position; 


public GridViewAdapter(Context context, ArrayList<Model_images> al_menu,int int_position) { 
    super(context, R.layout.adapter_photosfolder, al_menu); 
    this.al_menu = al_menu; 
    this.context = context; 
    this.int_position = int_position; 


} 

@Override 
public int getCount() { 

    Log.e("ADAPTER LIST SIZE", al_menu.get(int_position).getAl_imagepath().size() + ""); 
    return al_menu.get(int_position).getAl_imagepath().size(); 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

@Override 
public int getViewTypeCount() { 
    if (al_menu.get(int_position).getAl_imagepath().size() > 0) { 
     return al_menu.get(int_position).getAl_imagepath().size(); 
    } else { 
     return 1; 
    } 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 


@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 

     viewHolder = new ViewHolder(); 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.adapter_photosfolder, parent, false); 
     viewHolder.tv_foldern = (TextView) convertView.findViewById(R.id.tv_folder); 
     viewHolder.tv_foldersize = (TextView) convertView.findViewById(R.id.tv_folder2); 
     viewHolder.iv_image = (ImageView) convertView.findViewById(R.id.iv_image); 


     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    viewHolder.tv_foldern.setVisibility(View.GONE); 
    viewHolder.tv_foldersize.setVisibility(View.GONE); 



    Glide.with(context).load("file://" + al_menu.get(int_position).getAl_imagepath().get(position)) 
      .diskCacheStrategy(DiskCacheStrategy.NONE) 
      .skipMemoryCache(true) 
      .into(viewHolder.iv_image); 


    return convertView; 

} 

private static class ViewHolder { 
    TextView tv_foldern, tv_foldersize; 
    ImageView iv_image; 
} 

任何幫助表示讚賞。提前致謝。

回答

0

我太笨了,爲什麼我不知道這花了我很長時間才找出答案。

我通過重新啓動onActivityResult()中的片段來做到這一點。

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) { 
     Fragment galleryFragment = new GalleryFragment(); 
     FragmentManager fm = getFragmentManager(); 
     fm.popBackStack(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.container_gaFragments, galleryFragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 
} 

因此,每次活動的結果是成功的時候,我刷新片段到galleryFragment,它的工作原理是完美的。