2011-10-18 80 views
2

我的onActivityResult方法永遠不會被調用。我正在使用android 2.2Android onActivityResult從不叫

我正在使用一個Tabhost,其中TabHosts包含TabGroups其中包含單獨的活動。

我的一個個人活動的運行以下意圖

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, 
        "Select Picture"), 0); 

這個加載我的圖片庫的應用程序,我使用的是默認的Android庫中選擇一個圖像,當我回到我的onActivityResult不叫我的活動。

它看起來像這樣 - 我把一個斷點if(resultCode == 0),所以現在,我onActivityResult的邏輯不應該的問題

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == 0) { 
     if (requestCode == 0) { 
      Uri selectedImageUri = data.getData(); 

      //OI FILE Manager 
      filemanagerstring = selectedImageUri.getPath(); 

      //MEDIA GALLERY 
      selectedImagePath = getPath(selectedImageUri); 

      //DEBUG PURPOSE - you can delete this if you want 
      if(selectedImagePath!=null) 
       System.out.println(selectedImagePath); 
      else System.out.println("selectedImagePath is null"); 
      if(filemanagerstring!=null) 
       System.out.println(filemanagerstring); 
      else System.out.println("filemanagerstring is null"); 

      //NOW WE HAVE OUR WANTED STRING 
      if(selectedImagePath!=null) 
       System.out.println("selectedImagePath is the right one for you!"); 
      else 
       System.out.println("filemanagerstring is the right one for you!"); 
     } 
    } 
} 

生命週期函數通常被稱爲出的秩序和間歇性活動中的tabhost/tabgroup,所以我查看了在圖庫關閉後會調用哪些生命週期函數(只要我從android庫中選擇圖像,就會發生這種情況)

唯一被調用的是我的TabHost活動中的onResume() 。所以我嘗試在我的TabHost類AS和TabActivity類中放入完全相同的onActivityResult()方法。在方法開始的同一位置有一個斷點。

這兩個類都不會被調用。

我現在正在繪製一張空白圖片,如果沒有內置的接收方法會響應它,我如何從應用中的圖庫應用中獲得結果。

由於我知道我的主TabHost得到onResume()調用,我試圖添加Intent graphics = getIntent();,看看它是否會從圖庫選擇接收數據,它不,所以我不明白我怎麼能做的邏輯在onResume()方法。

解決方案歡迎! :)

+0

您確定您在調用startActivityForResult(..)的同一活動中有onActivityResult嗎? – dymmeh

+0

這是,我也將它添加到帶有斷點的tabgroup和tabactivity頁面,以查看是否有任何一個被調用。具有諷刺意味的是,如果它沒有被正確調用,它會拋出一個ActivityNotFoundException,並且這也不起作用:(或者根本不叫它 – CQM

+0

只是爲了好玩,你是否嘗試過創建一個測試項目,然後將你的意圖onActivityResult,你可以在上面的代碼中確認它是否有效,如果它不起作用,那麼你的手機/模擬器有些時髦,如果它確實起作用,你的代碼或者你正在調用沒有正確調用setResult(..) – dymmeh

回答

4

的解決方案是在主活性的頂部,以調用一個透明活動的名稱。這個透明的活動在tabhost之前,並且具有正常的生命週期功能。

這個透明的活動調用圖庫意圖onCreate(),它獲取一切在其onActivityResult返回正常的一切,你將能夠像平常一樣傳回返回到應用程序的其餘部分的信息。 finish()位於onActivityResult方法內部,因此用戶甚至不會注意到調用了透明活動。

更新從以下評論複製:

活動A通過正常的意圖調用活動B.活動B沒有XML和運行的onCreate這樣

,當活動C被完成它調用活動B

+2

這絕對應該被認爲是一個黑客順便說一句。 – Falmarri

+0

同意@Falmarri,這是相當「黑客」。然而,很高興聽到你想出了一個方法來使這個工作 – dymmeh

+0

是這個黑客的代碼示例可能嗎?真的很想知道這是如何實現的! –

1

使用的結果代碼的常數值:

Activity.RESULT_OK和 Activity.RESULT_CANCELED

你會看到,取消值實際上是0,所以在你的代碼是檢查活動是否被取消。

更改您的代碼

if (resultCode == Activity.RESULT_OK) { 
... 
} 

另外改變你的意圖的行動是:

intent.setAction(Intent.ACTION_PICK); 

如果你這樣做,你可以叫

Intent intent = new Intent(Intent.ACTION_PICK); 
    intent.setType("image/*"); 
    startActivityForResult(intent, 0); 

而不是創建的選擇器。它會自動選擇與該意圖和mimetype相關的活動並將它們顯示給你

+0

我將上面的代碼放在一個測試活動中,並在我的手機上試用了它,並且它工作得很完美,我不確定什麼會阻止onActivityResult(.. )您是否確定您在調用startActivityForResult(..)的同一活動中有onActivityResult? – dymmeh

-1

你有@Override在onActivityRestult之上嗎?

(看舊代碼,做這個所以不知道爲什麼它需要)的呼叫super.onactivityresult(requestcode,resultscode,數據)的方法,第一次調用

也是我的意圖沒有必須在其他的東西他們 startActivityForResult(Intent.createChooser(意圖, 「選擇圖片」),0); 我認爲應該只是 startActivityForResult(source.class,destination.class);當然源和目的地的 應的類

public class ImageSwitcherView extends Activity { 
    int pics[] = { R.drawable.image000, R.drawable.image001, 
      R.drawable.image002}; 

    private int currentIndex = 0; 
    SharedPreferences preferences; 
    Gallery gallery; 
    ImageView fullPicView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.galleryview); 
     Bundle extras = getIntent().getExtras(); 
     currentIndex = extras.getInt("bookmark"); 
     gallery = (Gallery) findViewById(R.id.Gallery01); 

     gallery.setAdapter(new ImageAdapter(this)); 
     gallery.setSelection(currentIndex); 
     gallery.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView parent, View v, int position, 
        long id) { 
       currentIndex = position; 
       // ---display the images selected--- 
       fullPicView = (ImageView) findViewById(R.id.imageView1); 
       fullPicView.setImageResource(pics[currentIndex]); 
       fullPicView.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         Intent myIntent = new Intent(ImageSwitcherView.this, 
           imageView.class); 
         int resID = pics[currentIndex]; 
         myIntent.putExtra("resID", resID); 
         myIntent.putExtra("index", currentIndex); 
         startActivityForResult(myIntent, 1); 
        } 
       }); 
      } 
     }); 
    } 

    public class ImageAdapter extends BaseAdapter { 
     private Context context; 
     private int itemBackground; 

     public ImageAdapter(Context c) { 
      context = c; 
      // ---setting the style--- 
      TypedArray a = obtainStyledAttributes(R.styleable.Gallery1); 
      itemBackground = a.getResourceId(
        R.styleable.Gallery1_android_galleryItemBackground, 0); 
      a.recycle(); 
     } 

     // ---returns the number of images--- 
     public int getCount() { 
      return pics.length; 
     } 

     // ---returns the ID of an item--- 
     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     // ---returns an ImageView view--- 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView imageView = new ImageView(context); 
      imageView.setImageResource(pics[position]); 
      imageView.setScaleType(ImageView.ScaleType.FIT_XY); 
      imageView.setLayoutParams(new Gallery.LayoutParams(150, 120)); 
      imageView.setBackgroundResource(itemBackground); 
      return imageView; 
     } 
    } 

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

     currentIndex = data.getIntExtra("bookmark", 0); 
     gallery.setSelection(currentIndex); 
     fullPicView.setImageResource(pics[currentIndex]); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK 
       || keyCode == KeyEvent.KEYCODE_HOME) { 
      preferences = PreferenceManager.getDefaultSharedPreferences(this); 

      SharedPreferences.Editor editor = preferences.edit(); 
      editor.putInt("bookmark", gallery.getSelectedItemPosition()); 
      editor.commit(); 
      finish(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

} 
+0

覆蓋是否存在於我的活動中,我會嘗試您的其他推薦修改 – CQM

+0

也嘗試下面Dotroph建議的內容嗎? –

+0

關於意圖,我打開內置畫廊,這調用了我的應用程序之外的Android應用程序。如果它不在我的應用程序中,我無法執行source.class,destination.class。無論如何,我沒有運氣。我的活動仍然沒有被調用。使用Dophie的結果代碼和你的超級建議 – CQM

16

的onActivityResult從這樣一個在許多問題來看,有很多原因,一個叫活動可能不會觸發調用者的方法onActivityResult()

一個原因,我發現,當我叫startActivityForResult(intent, requestCode),用了不到0.我的應用程序的requestCode值並不需要requestCode和使用< 0也不會派一個requestCode的Android文檔說。

但是Android文檔並未提及requestCode < 0的後果。其結果是它阻止了調用者的方法被調用!哎喲!

因此,即使您的應用程序不需要requestCode,你很多仍想使用一個值> = 0

這就是我今天所學:-)

+0

是的,我想我看到了一個類似的答案,最近在不同的應用程序中自己嘗試過。 – CQM

18

嘗試調用startActivityForResult使用包含當前活動的選項卡組活動的上下文,然後監聽選項卡組活動。

使用該工具來獲取tabGroupActivity:從它

TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 

然後調用startActivityForResult:

parentActivity.startActivityForResult(...); 

最後,把一個onActivityResult聽衆在tabGroupActivity:

protected void onActivityResult(int requestCode, int resultCode,Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
    } 
+1

+1我正在調用startActivityForResult )從一個片段,所以我不得不在前面加上父Activity活動上下文。 – cdavidyoung

0

的onActivityResult調用的方式取決於您的Activity的launchMode (在清單中)。我不確定這是否會成爲問題。

2

你只需要刪除android:noHistory="true"這個形式的清單文件。