2012-01-12 56 views
27

Tôi gặp sự cố khi nhập ảnh từ Album trong Android, vì phương thức onActivityResult() không bao giờ được gọi.onActivityResult() không được gọi khi Activity bắt đầu từ Fragment

Đây là mã mà tôi đã viết (gọi từ một mảnh vỡ không phải là một hoạt động):

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 

Và bằng cách này, tôi đã xác định onActivityResult() nhưng nó không bao giờ kích hoạt:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "onActivityResult"); // not printed 
} 

Bất kỳ ý tưởng có gì sai với điều này?

Cảm ơn!

+3

thêm constructor, super.onActivityResult (requestCode, resultCode, dữ liệu); – Venky

+0

Tôi đã chỉnh sửa câu hỏi, thực sự mã của tôi đã có dòng đó. –

+0

Bạn cần chọn hình ảnh từ Thư viện phải không? – Venky

Trả lời

111

Để có onActivityResult() gọi trong mảnh, bạn nên gọi phiên bản của mảnh startActivityForResult(), không phải là hoạt động của. Vì vậy, trong mã của mảnh của bạn, thay thế

getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 

với

startActivityForResult(galleryIntent, PICK_IMAGE); 
+8

Vì vậy, dễ dàng để làm cho rằng sai lầm khi chuyển đổi hoạt động để Fragments :-) – Kuffs

+2

WOW làm việc :) tốt đẹp, chúng tôi luôn luôn sử dụng getActivity() trong fragments :) giúp tôi rất nhiều – Javier

+1

này phải là câu trả lời đúng, phương pháp khác gọi một phương pháp bên trong mảnh của bạn là một cách giải quyết – irwinb

-2

Hãy thử Snippet này:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); 
    intent.setType("image/*"); 
    intent.putExtra("return-data", true); 
    startActivityForResult(intent, 1); 


    @Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 

     case 1: 
      if(requestCode == 1 && data != null && data.getData() != null){ 
       Uri _uri = data.getData(); 

       if (_uri != null) { 
        Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
        cursor.moveToFirst(); 
        final String imageFilePath = cursor.getString(0); 
        File photos= new File(imageFilePath); 
        imageView.setImageBitmap(bitmap); 
        cursor.close(); 
       } 
      } 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 
+6

lý do tại sao u gọi "super.onActivityResult (requestCode, resultCode, data);" hai lần ?? –

16

Với mã này:

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 

Các onActivityResult phải nằm trong Hoạt động chứa Fragment. Từ đó bạn có thể gọi bất kỳ phương pháp nào của đoạn, không phải trong đoạn.

MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment); 
myFragment .onCameraResult(requestCode, resultCode, intent); 

làm ở đó bất cứ điều gì bạn muốn

+1

Không thể tin rằng tôi đã không nhìn thấy nó trước đây! Cảm ơn :) –

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