2016-03-04 80 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); 

    }