6

我有'SherlockFragmentActivity'與overAided'onActivityResult'。onCreate在我從圖庫中挑選圖片後調用onActivityResult

我嘗試從相機和畫廊獲取圖像並裁剪它。 問題是我在onActivityResult調用後返回了我的activity沒有片段。

... 
      FragmentTransaction t = fragmentManager.beginTransaction(); 
      LogInFragment logFrag = new LogInFragment(); 
      t.replace(R.id.fragment_container, logFrag); 
      t.commit(); 
... 
    @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
     } 

活動佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/fragment_container" 
       android:background="@color/textWhite" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

</RelativeLayout> 

而且我也有 'SherlockFragment',我攝取的圖像:

startImagePickerDialog(this); 


public void startImagePickerDialog() { 
     AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(getSherlockActivity()); 
     myAlertDialog.setTitle("Upload Pictures Option"); 
     myAlertDialog.setMessage("How do you want to set your picture?"); 

     myAlertDialog.setPositiveButton("Gallery", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface arg0, int arg1) { 
       Intent intent = new Intent(); 
       // call android default gallery 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       // ******** code for crop image 
       intent.putExtra("crop", "true"); 
       intent.putExtra("aspectX", 1); 
       intent.putExtra("aspectY", 1); 
       intent.putExtra("outputX", 200); 
       intent.putExtra("outputY", 200); 
       intent.putExtra("noFaceDetection", true); 
       try { 
        intent.putExtra("return-data", true); 
        startActivityForResult(Intent.createChooser(intent, 
          "Complete action using"), Const.GALLERY_PICTURE); 
       } catch (ActivityNotFoundException e) { 
        Log.e(LOG_TAG, "ActivityNotFoundException"); 
       } 
      } 
     }); 
     myAlertDialog.setNegativeButton("Camera", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface arg0, int arg1) { 
       // call android default camera 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, 
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()); 
       intent.putExtra("crop", "true"); 
       intent.putExtra("aspectX", 1); 
       intent.putExtra("aspectY", 1); 
       intent.putExtra("outputX", 200); 
       intent.putExtra("outputY", 200); 
       intent.putExtra("noFaceDetection", true); 
       try { 
        intent.putExtra("return-data", true); 
        startActivityForResult(intent, Const.CAMERA_REQUEST); 
       } catch (ActivityNotFoundException e) { 
        Log.e(LOG_TAG, "ActivityNotFoundException"); 
       } 
      } 
     }); 
     myAlertDialog.show(); 
    } 

而在 'SherlockFragment' 'onActivityResult':

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

     if (resultCode != getSherlockActivity().RESULT_OK) { 
      Log.e(LOG_TAG, "resultCode != RESULT_OK"); 
      return; 
     } 

     if (requestCode == Const.CAMERA_REQUEST) { 
      Log.d(LOG_TAG, "requestCode == CAMERA_REQUEST"); 
      Bundle extras = data.getExtras(); 
      if (extras != null) { 
       Log.d(LOG_TAG, "extras != null"); 
       Bitmap photo = extras.getParcelable("data"); 
       icon.setImageBitmap(photo); 
      } 
     } 

     if (requestCode == Const.GALLERY_PICTURE) { 
      Log.d(LOG_TAG, "requestCode == GALLERY_PICTURE"); 
      Bundle extras2 = data.getExtras(); 
      if (extras2 != null) { 
       Log.d(LOG_TAG, "extras != null"); 
       Bitmap photo = extras2.getParcelable("data"); 
       icon.setImageBitmap(photo); 
      } 
     } 
    } 

UPDATE 當我調用相機活動時,我的主要活動調用'onSaveInstanceState',之後'onRestoreInstanceState'。這是一個原因嗎?

回答

0

嘗試像這樣

變化

Bitmap photo = extras.getParcelable("data"); 

Bitmap photo=(Bitmap) intent.getExtras().get("data"); 

編輯: -

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

      if (resultCode != getSherlockActivity().RESULT_OK) { 
       Log.e(LOG_TAG, "resultCode != RESULT_OK"); 
       return; 
      } 

      if (requestCode == Const.CAMERA_REQUEST) { 
       Log.d(LOG_TAG, "requestCode == CAMERA_REQUEST"); 
       Bitmap photo=(Bitmap) intent.getExtras().get("data");// Changed Here 
       icon.setImageBitmap(photo); 

      } 

      if (requestCode == Const.GALLERY_PICTURE) { 
       Log.d(LOG_TAG, "requestCode == GALLERY_PICTURE"); 
       Uri imageUri= intent.getData();// Changed Here, or first decode the image to Avoid OutOfMemory Error 
       icon.setImageURI(imageUri); 
      } 
     } 
+1

其他未獲取圖像的問題。 – Val

0

請更換

frag.startActivityForResult(...); 

在你的片段與

startActivityForResult(...) 
+0

我刪除了該代碼,但得到了相同的結果。 – Val

9
  1. 檢查您的 「設置」 - > 「開發人員選項」 - > 「不保留活動」 標誌。
  2. 這是android的本質,如果你的設備需要內存,它會破壞不可見的活動。所以你必須考慮到你的活動可以隨時重新創建。順便說一句,「不要保持活動」選項是爲了模擬你的應用程序,當你的設備需要內存並破壞你的後臺堆棧活動時。
+0

我爲所有手機創建代碼,不僅是帶有此標誌的手機。 – Val

+0

我無法理解你的評論。 Android 4.0及更高版本的設備有一個選項,稱爲不保留活動。如果在設備上選擇它,那麼您的後臺堆棧活動將被銷燬並重新創建。只需檢查你的測試設備,並確保它不是你的問題的原因。 – Devrim

+0

@aegean迷人的解決方案 –

相關問題