11

Szukałem w tysiącach wpisów na ten temat, ale nie wiem, jak rozwiązać mój problem.Funkcja onActivityResult() nie jest wykonywana w DialogFragment

Mam ImageView. Gdy użytkownik kliknie na ten obraz, pojawi się DialogFragment, a użytkownik może wybrać między zrobieniem nowego zdjęcia z aparatem lub wyborem zdjęcia z galerii. Do tego czasu wszystko działa dobrze.

Problem polega na tym, że obraz wybrany przez użytkownika powinien zastąpić bieżący obraz w ImageView, ale ten bit jest tym, który nie działa, ponieważ funkcja onActivityResult(), która wykonuje ten kod, nie jest wykonane, więc obraz w ImageView zawsze pozostaje taki sam. Byłbym wdzięczny za każdą pomoc, ponieważ nie widzę ani nie rozumiem, dlaczego ten kod nie jest wykonywany.

Dostaję ostrzeżenie w LogCat zaraz po wybraniu przez użytkownika obraz:

05-07 12:17:11.542: I/ActivityManager(59): Displayed activity com.android.gallery/com.android.camera.ImageGallery: 935 ms (total 935 ms) 

05-07 12:17:12.812: W/FragmentActivity(3614): Activity result no fragment exists for index: 0x10001 

05-07 12:17:12.862: W/InputManagerService(59): Starting input on non-focused client [email protected] (uid=10016 pid=317) 

Activity.java:

private ImageView imageLoader = null; 
imageLoader = (ImageView) findViewById(R.id.f_imageLoader);   
imageLoader.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     ImageLoaderDialog imageLoaderDialog = new ImageLoaderDialog(imageLoader); 
     imageLoaderDialog.show(getSupportFragmentManager(), "imageLoaderDialog"); 
} 

Activity.xml:

<ImageView 
    android:id="@+id/f_imageLoader" 
android:layout_width="wrap_content" 
    android:layout_height="0dip" 
    android:layout_weight="0.20" 
android:contentDescription="@string/imgDesc" 
    android:src="@drawable/my_image" /> 

ImageLoaderDialog .java:

//Dialog for choosing between new camera image or gallery image. 
public class ImageLoaderDialog extends android.support.v4.app.DialogFragment { 
    private ImageView targetImageView = null; 
    final int TAKE_PICTURE = 0; 
    final int PICK_PHOTO = 1; 

    public ImageLoaderDialog (View view) { 
     targetImageView = (ImageView) view; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle("Selecciona"); 
     final String[] imageSources = getResources().getStringArray(R.array.imageSources); 
     builder.setItems(imageSources, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       switch(item) { 
        case TAKE_PICTURE: 
         Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         startActivityForResult(takePicture, TAKE_PICTURE); 
         break; 
        case PICK_PHOTO: 
         Intent pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
         startActivityForResult(pickPhoto, PICK_PHOTO); 
         break; 
       } 
      } 
     }); 
     return builder.create(); 
    } 

//Set image to user's selected image. 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if (resultCode == android.app.Activity.RESULT_OK) { 
     Uri selectedImage = intent.getData(); 
     Log.i("IMAGEN", ""+selectedImage); 
     targetImageView.setImageURI(selectedImage); 
    } 
} 
} 

Każda pomoc będzie bardzo doceniana.

Odpowiedz

1

Aktywność hostingu przeszła w tryb onActivityResult, ale nie wywołała super.onActivityResult dla nieobsługiwanych kodów wyników. Wygląda na to, że choć fragment jest tym, który wywołuje wywołanie startActivityForResult, to działanie otrzymuje pierwsze ujęcie w obsłudze wyniku. Ma to sens, gdy bierze się pod uwagę modułowość fragmentów. Po zaimplementowaniu metody super.onActivityResult dla wszystkich nieobsłużonych wyników fragment uzyskał szansę na obsłużenie wyniku. Spróbuj:

getActivity().onActivityResult(requestCode, resultCode, intent); 
+0

niewidoczny dla FragmentActivity. – Rowan

+0

To najwyraźniej już nie prawda w systemie Android 4.4.2. Jeśli fragment wywołuje własny 'startActivityForResult (...)', funkcja 'onActivityResult (...)' jest * nie * wywoływana. Jeśli fragment nazywa się "getActivity(). StartActivityForResult (...)", to jest. –

Powiązane problemy