11

Tôi đã tìm kiếm trong hàng ngàn bài đăng cho điều này, nhưng tôi không tìm thấy cách giải quyết vấn đề của mình.onActivityResult() không được thực hiện trong DialogFragment

Tôi có một ImageView. Khi người dùng nhấp vào ImageView này, một DialogFragment được hiển thị và người dùng có thể chọn giữa chụp ảnh mới bằng máy ảnh hoặc chọn ảnh từ thư viện. Cho đến đây, mọi thứ đều hoạt động tốt.

Vấn đề là, hình ảnh do người dùng chọn, nên thay thế hình ảnh hiện tại trong ImageView, nhưng bit này, là một cái không hoạt động, bởi vì hàm onActivityResult() thực thi mã này không được được thực hiện, vì vậy hình ảnh trong ImageView luôn giữ nguyên. Tôi sẽ đánh giá cao bất kỳ sự giúp đỡ nào, bởi vì tôi không thấy hoặc hiểu, tại sao mã này không được thực hiện.

Tôi nhận được một cảnh báo trong LogCat ngay sau khi người sử dụng chọn hình ảnh:

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

Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Trả lời

1

Hoạt động lưu trữ vượt quá onActivityResult nhưng không thực hiện cuộc gọi tới super.onActivityResult cho các mã kết quả không được xử lý. Rõ ràng mặc dù đoạn là một trong những thực hiện các cuộc gọi startActivityForResult, hoạt động được bắn đầu tiên tại xử lý kết quả. Điều này có ý nghĩa khi bạn xem xét tính mô đun của các đoạn. Khi tôi đã triển khai super.onActivityResult cho tất cả các kết quả không được xử lý, đoạn này sẽ có một ảnh hưởng đến kết quả xử lý.Try This:

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

không hiển thị cho FragmentActivity. – Rowan

+0

Điều này dường như không còn đúng trên Android 4.4.2 nữa. Nếu đoạn này gọi 'startActivityForResult (...)' của riêng nó, 'onActivityResult (...)' của hoạt động là * not * được gọi. Nếu đoạn gọi là 'getActivity(). StartActivityForResult (...)', nó là. –

Các vấn đề liên quan