2016-03-04 72 views
0

我是Android的初学者。无法访问片段中的onActivityResult()方法

我将从相机和文件资源管理器中制作图像选择器。

我从谷歌搜索中找到了示例代码。

但是捕获后,它不会调用onActivityResult()方法。

所以我无法处理捕获结果。

说明:我正在研究Fragment

public void selectImage(){ 
final String [] items = new String [] {"Take Photo", "Choose Photo"}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String> (getActivity(), android.R.layout.select_dialog_item, items); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle("Add/Change Photo"); 
     builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       if (item == 0) { 
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        File file  = new File(Environment.getExternalStorageDirectory(), 
          "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); 
        mImageCaptureUri = Uri.fromFile(file); 
        try { 
         intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri); 
         intent.putExtra("return-data", true); 

         startActivityForResult(intent, PICK_FROM_CAMERA); 
        } 
        catch (Exception e) { 
         e.printStackTrace(); 
        } 
        dialog.cancel(); 
       } 
       else { 
        Intent intent = new Intent(); 
        intent.setType("image/*"); 
        intent.setAction(Intent.ACTION_GET_CONTENT); 
        getActivity().startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); 
       } 
      } 
     }); 
     final AlertDialog dialog = builder.create(); 
     dialog.show(); 
    } 

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

     // TODO Fix no activity available 
     if (resultCode != getActivity().RESULT_OK) 
      return; 
     Bitmap bitmap = null; 
     String path  = ""; 
     if (requestCode == PICK_FROM_FILE) { 
      mImageCaptureUri = data.getData(); 
      path = getRealPathFromURI(mImageCaptureUri); // From Gallery 

      if (path == null) 
       path = mImageCaptureUri.getPath(); // From File Manager 

      if (path != null) 
       bitmap = BitmapFactory.decodeFile(path); 
     } 
     else { 
      path = mImageCaptureUri.getPath(); 
      bitmap = BitmapFactory.decodeFile(path); 
     } 

     imgProfile.setImageBitmap(bitmap); 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

回答

0

在您的片段代码中,您需要调用片段中的活动。而不是:

getActivity().startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); 

您需要调用以下代码,因为您的代码位于嵌套类中。

YOUR_FRAGMENT.this.startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); 

没有getActivity

+0

感谢您的时间。 但我试图访问没有getActivity(),但我不能。 任何其他idear? –

+0

你为什么不能那样做? –

+0

检查您是否在此片段的父活动的onActivityResult()方法中获得游标 –

1

调用getActivity().startActivityForResult()将导致对活动onActivityResult()调用托管的片段,而不是片段它自身的onActivityResult()

如果你想在片段本身onActivityResult()通话呼叫

startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); 

,如果你要处理它,它需要调用的活动:

getActivity().startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); 

你也可能想重新组织你的onActivityResult()为

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

     // TODO Fix no activity available 
     if (resultCode != getActivity().RESULT_OK) 
      Bitmap bitmap = null; 
     String path = ""; 
     if (requestCode == PICK_FROM_FILE) { 
      mImageCaptureUri = data.getData(); 
      path = getRealPathFromURI(mImageCaptureUri); // From Gallery 

      if (path == null) 
       path = mImageCaptureUri.getPath(); // From File Manager 

      if (path != null) 
       bitmap = BitmapFactory.decodeFile(path); 
     } else { 
      path = mImageCaptureUri.getPath(); 
      bitmap = BitmapFactory.decodeFile(path); 
     } 

     imgProfile.setImageBitmap(bitmap); 

    }