Jest to jeden z najbardziej popularnych kwestii. Możemy znaleźć wiele wątków dotyczących tego problemu. Ale żaden z nich nie jest przydatny dla MNIE.
Rozwiązałem ten problem, korzystając z tego rozwiązania.
Najpierw zrozumiemy, dlaczego tak się dzieje.
Możemy zadzwonić startActivityForResult
bezpośrednio od Fragment ale faktycznie mechanik za wszystkie są obsługiwane przez działania.
Po wywołaniu startActivityForResult
z fragmentu, requestCode zostaną zmienione, aby dołączyć do tożsamości fragment kodu. Pozwoli to Działowi na śledzenie tego, kto wysyła tę prośbę po otrzymaniu wyniku.
Po przejściu Aktywności, wynik zostanie wysłany do funkcji Aktywność onActivityResult ze zmodyfikowanym kodem request, który zostanie zdekodowany na oryginalną tożsamość requestCode + Fragment. Następnie aktywność wyśle wynik działania do tego fragmentu za pomocą funkcji onActivityResult. I wszystko jest gotowe.
Problem polega na:
aktywny może wysłać wynik do tylko fragment, który został dołączony bezpośrednio do działalności, ale nie zagnieżdżone jeden. Z tego powodu funkcja onActivityResult zagnieżdżonego fragmentu nigdy nie zostałaby wywołana bez względu na wszystko.
Rozwiązanie:
1) Zacznij Intent aparat w swojej Fragment według kodu poniżej:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Fragment frag = this;
/** Pass your fragment reference **/
frag.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); // REQUEST_IMAGE_CAPTURE = 12345
2) Teraz w swojej dominującej Aktywny ręcznym ** onActivityResult()
: **
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Musisz zadzwonić do tego w aktywności rodziców, aby to zadziałało.
3) W swojej rozmowy fragment:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_IMAGE_CAPTURE) {
// Do something with imagePath
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageview.setImageBitmap(photo);
// CALL THIS METHOD TO GET THE URI FROM THE BITMAP
Uri selectedImage = getImageUri(getActivity(), photo);
String realPath=getRealPathFromURI(selectedImage);
selectedImage = Uri.parse(realPath);
}
}
}
4) metody referencyjne dla coraz URI:
-> Metoda uzyskiwania URI z Bitmap
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
-> Metoda getti ng Ścieżka pliku od Uri
public String getRealPathFromURI(Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
To wszystko. Dzięki temu rozwiązaniu można go zastosować do dowolnego pojedynczego fragmentu, niezależnie od tego, czy jest zagnieżdżony, czy nie. I tak, obejmuje to również całą sprawę! Co więcej, kody są również ładne i czyste.
Czy to onActivityResult na fragmencie lub aktywności? – Maxrunner
Moja funkcja onActivityResult nie jest wyzwalana. umieszczam obie te metody w moim fragmencie. czy jest coś jeszcze, co powinienem zrobić? – FilipLuch
Funkcja onActivityResult uruchomiona w działaniu, które wywołało fragment –