2014-10-09 64 views
0

如何使用startActivityForResult的活動範圍之外的一個普通的Java類startActivityForResult某項活動

EX說。在這種方法中,我必須打開設備相機並獲取圖像並對其進行處理。

問題是控件不會去往SampleClass裏面的onActivityResult回調方法,而是它將在MainActivity內部的onActivityResult回調方法。我究竟做錯了什麼?

我只需要能夠處理Sample Class內的圖像。我怎樣才能做到這一點

代碼段

主要活動:

public class MainActivity extends Activity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
... 
... 

    SampleClass sample = new Sample(this); 
    sample.openCamera(); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == 0){ 
     if(resultCode == RESULT_OK){ 
      syso("INSIDE MAIN ACTIVITY"); 
     } 

     if(resultCode == RESULT_CANCELED){ 
      ... 
     } 
    } 
} 

}

示例類:

public class SampleClass extends Activity{ 

private Context context; 

public SampleClass(Context context){ 
    this.context = context; 
} 

public void openCamera(){ 
    Intent photoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    ((Activity) context).startActivityForResult(photoIntent, 0); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(requestCode == 0){ 
     if(resultCode == RESULT_OK){ 
      //get the image 
      // process it. 

      syso("INSIDE SAMPLE CLASS"); 
     } 

     if(resultCode == RESULT_CANCELED){ 

     } 
    } 
} 

}

如果我運行這個程序,控制檯上的輸出是INSIDE MAIN ACTIVITY。我想要的是能夠將INSIDE SAMPLE CLASS作爲輸出。

感謝和問候

+0

向我們展示openCamera(); – NoXSaeeD 2014-10-09 13:50:02

回答

0

問題是,您使用MainActivity上下文打開相機! 肯定會觸發onActivityResult()的MainACtivity。

((Activity) context).startActivityForResult(photoIntent, 0); 

請參閱context object = MainActivity檢查您的SimpleClass構造函數。

public SampleClass(Context context){ 
// when you call from mainActivity and send **this** it means context = MainActivty 
this.context = context; 
} 
如果你想SampleClass onActivityResult()

觸發有別的沒有辦法延伸活動 然後調用它像normall方式....

Intent photoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
context.startActivityForResult(photoIntent, 0); // context must = SampleClass(); no other way 

,但如果你仍然想亨德爾SimpleClass圖像,然後按照這個代碼刪除擴展活動

SimpleClass

public static void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if(requestCode == 0){ 
    if(resultCode == RESULT_OK){ 
     //get the image 
     // process it. 

     syso("INSIDE SAMPLE CLASS"); 
    } 

     if(resultCode == RESULT_CANCELED){ 

     } 
    } 
} 

,並在您MainActivity類別

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    SimpleClass.onActivityResult(requestCode,resultCode,data); 
} 

永遠不會創造新的對象使用新的關鍵字活動Adnroid內OS會爲你做的,當你說

Itnent foo = new(context,foo.class); 

,如果你做了,也許這意味着破解代碼和Android操作系統。

我希望你能理解,並希望這有助於

+0

謝謝..我試試這個..我明白這是不好的編程,但我不得不嘗試這些黑客,因爲我不想使用意圖和活動。我不知道...可能是我需要重新評估爲什麼我採取了這個決定! – Ashwin 2014-10-09 14:27:30

+0

什麼促使你避免意圖和活動? – iZBasit 2014-10-09 15:43:49

+0

@iZBasit在主要活動中,我有一些UI元素和由SampleClass(即)控制的屏幕的專用部分(相對佈局100 X 100),我將本節的引用傳遞給SampleClass。 SampleClass在該部分中添加UI,並控制該部分中的所有交互。其他主要活動的用戶界面不受干擾。如果我使用Intents,我將能夠將UI元素嵌入到主要活動中?我不知道如何去做,因此最終選擇了這種方法。有沒有更好的方法來實現這一目標?上面的例子只是一個例子,不是真正的用法 – Ashwin 2014-10-10 11:55:16

1

這是不可能的。 onActivityResuly將在該活動上被調用,該活動已經執行了另一項活動。

所以,如果你把活性1實例來運行其他活動,其他活動將調用activity1.onActivityResult()

2

而不是使用

SampleClass sample = new Sample(this); 
sample.openCamera(); 

的只是使用

Intent intent = new Intent(this, SampleClass .class); 

,寫SampleClass onCreate調用openCamera()。

希望這會有所幫助。

+0

這意味着我在清單中添加了sampleclass。對 ?我試圖避免這一點! – Ashwin 2014-10-09 13:49:09

+0

是的,因爲您創建爲活動。只有調用startActivityForResult的活動纔會回調。在你的情況下它的SampleClass。 – khurram 2014-10-09 13:50:48

+1

您通常不應使用構造函數創建活動,而是按照建議使用意圖。因爲SampleClass不是經過了充分生命週期的有效註冊的Activity,所以很明顯爲什麼會觸發MainActivity的回調方法。如果你想要觸發SampleClass的回調,你必須使用一個意圖來創建它! – schubakah 2014-10-09 13:54:06

相關問題