11

ausgeführt habe Ich habe in tausend Beiträge dafür gesucht, aber ich finde nicht, wie ich mein Problem lösen.onActivityResult() nicht in DialogFragment

Ich habe ein ImageView. Wenn der Benutzer auf dieses ImageView klickt, wird ein DialogFragment angezeigt, und der Benutzer kann wählen, ob er ein neues Bild mit der Kamera aufnehmen oder ein Bild aus der Galerie auswählen möchte. Bis hier läuft alles gut.

Das Problem ist, dass das Bild durch den Benutzer ausgewählt, sollte den Strom einen in der Image ersetzen, aber dieses Bit, ist derjenige, der nicht funktioniert, weil die onActivityResult() Funktion, die diesen Code ausführt, nicht wird ausgeführt, so bleibt das Bild im ImageView immer gleich. Ich würde jede Hilfe schätzen, weil ich nicht sehe oder verstehe, warum dieser Code nicht ausgeführt wird.

Ich bin eine Warnung in der LogCat direkt nach dem Benutzer immer wählt das Bild:

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

Jede Hilfe wäre sehr willkommen.

Antwort

1

Die Hosting-Aktivität hat das onActivityResult überschrieben, aber keinen Aufruf von super.onActivityResult für unbehandelte Ergebniscodes ausgelöst. Obwohl das Fragment den StartActivityForResult-Aufruf ausführt, erhält die Aktivität offensichtlich den ersten Treffer bei der Verarbeitung des Ergebnisses. Dies ist sinnvoll, wenn man die Modularität von Fragmenten betrachtet. Sobald ich super.onActivityResult für alle unbehandelten Ergebnisse implementiert hatte, bekam das Fragment eine Chance, das Ergebnis zu verarbeiten. Versuchen Sie Folgendes:

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

nicht sichtbar für FragmentActivity. – Rowan

+0

Dies gilt anscheinend nicht mehr für Android 4.4.2. Wenn das Fragment sein eigenes 'startActivityForResult (...) 'aufruft, wird das' onActivityResult (...) 'der Aktivität * nicht * aufgerufen. Wenn das Fragment 'getActivity(). StartActivityForResult (...)' aufruft, ist es das. –