2011-04-25 46 views
1

我一直在想這個問題幾個小時,現在沒有找到解決方案。不過我想我只是忽略了一些非常簡單的事情。Android - Java - 從另一個實例類中訪問主活動中的私有變量

我的程序主要是記錄和回放音頻,所以我得到了一個主要活動,其中包含與用戶交互的所有功能,我有一個叫'AudioHandler'的類來管理所有的音頻內容在背景中。 主要活動使用AudioHandler的一個實例。

在AudioHandler類中,我得到了一個OnCompletionListener,用於注意錄製的音頻文件的播放何時完成。

問題是:當回放完成 - 並且OnCompletionListener被調用時,我想在主活動中更改ImageView(將暫停按鈕變成播放按鈕)。

如何從AudioHandler實例訪問Main-Activity中的ImageView?

...沒有將ImageView-Variable公開。

方法調用在主活動從AudioHandler玩法:

public State playRecording() { 
    //change play-button to stop-button 
    iPlay.setImageResource(R.drawable.stop_button_active); 

    //start or resume playback of the recorded Audio 
    ah.play(); 

    //Return that the program is in playing-mode 
    return State.PLAYING; 
} 

播放功能AudioHandler

public void play() { 
     try { 

      mPlayer.start(); 
     } catch (IllegalArgumentException e) { 
      Log.d("MEDIA_PLAYER", e.getMessage()); 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      Log.d("MEDIA_PLAYER", e.getMessage()); 
      e.printStackTrace(); 
     } 




     //add listener to notice when the end of the audio record has been reached 
     mPlayer.setOnCompletionListener(new OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 

       //should somehow change the ImageView 'iPlay' in the Main-Activity when reaching this point. 



      } 
     });  
    } 

任何幫助表示讚賞:)

Marco

回答

3

如果您需要訪問變量,那麼該變量應該是程序包可訪問的或公共的。或者,更好的是,你應該有一個封裝方法。喜歡的東西:

// On the main class: 
public ImageView getIPlay(){ 
    return iPlay; 
} 
private static MainActivity instance; 
public MainActivity getInstance(){ 
    return instance; 
} 

/** Either on the constructor or the 'OnCreate' method, you should add: */ 
    instance = this; 

現在你可以從任何活動或類訪問的ImageView:

MainActivity.getInstance().getIPlay(); 

就這麼簡單,真的。您可以通過許多其他解決方案,通過AOP或任何類型的東西使用反射。但這只是使問題更加複雜。嘗試創建setter方法。

+0

但是,如何在沒有主要活動的實際實例的情況下從另一個類訪問getter和setter? – MarcoSz 2011-04-25 21:02:53

+0

您可以像創建一個Singleton一樣創建主要活動。讓我編輯我的答案。 – 2011-04-25 21:04:27

+0

完成。請參閱最新的答案。 – 2011-04-25 21:06:23

0

您可以在主Activity中創建一個公共包裝方法,在暫停和播放之間切換ImageView。或者,您可以將ImageView傳遞給AudioHandler(通過構造函數?),然後在那裏操縱它。

+0

通過構造函數傳遞ImageView。我仍然在運行時遇到錯誤,但至少編譯沒有錯誤。猜猜這是我還沒找到的另一個bug。 – MarcoSz 2011-04-25 20:56:48

+0

包裝類將不起作用,因爲我無法從另一個類訪問Main-Activity的功能 - 因爲它沒有實例。有沒有辦法做到我不知道?感謝您的幫助。 – MarcoSz 2011-04-25 20:59:06

+0

您可以在技術上將「this」作爲參數傳遞給構造函數。然後,您可以將該切換功能從該活動的實例中調出。 – Haphazard 2011-04-25 21:07:44

1

你的問題是關於對象封裝。

當您將一個實例變量定義爲私有時,您說只有該對象和該類的成員可以訪問該變量。這是一件好事,因爲它可以防止您意外更改您不想要的數據。這也是爲什麼我們有getter和setter。

所以在你的類你有什麼事情我想是這樣的

public class Main { 
... some code here 
    private ImageView myView; 
... more code here 

你需要做的是下面的方法添加到您的主類什麼

public ImageView getView() { 
     return myView; 
} 

public void setView(ImageView a) { 
     myView = a; 
} 

所以現在當你想從另一個類訪問ImageView時,你只需調用一些類似Main.getView (),你會擁有它。

現在,如果這不能回答你的問題,那是因爲你沒有太過周到地設計你的應用程序(所以它似乎),但幸運的是,我不會是那種反應者,告訴你要拔掉你所做的一切並重新開始。

這聽起來像你正在使用Android應用程序,你的問題是活動之間的溝通。

這就是爲什麼Android有一些稱爲Intents的原因。您可以將意向從一項活動發送到另一項活動以攜帶數據。因此,在這種情況下,您會將一個Intent從一個活動發送到主類,它會告訴主類在圖像視圖中更改圖片。我不會說謊,我吮吸使用意圖,但有許多精彩的在線教程,會告訴你如何做到這一點。

另一種選擇是創建具有播放/暫停按鈕的佈局的RemoteView,並從其他活動訪問它,RemoteView具有內置函數來更改遠程圖像視圖的位圖(請參閱Android關於RemoteView的開發人員文檔,以獲得更多信息)

對不起,我無法給你一些實際的代碼,我對這些主題的能力還不夠自信,但我100%確信其中的一個我剛剛列出的三種方法將回答你的問題。

+0

感謝您的詳細解釋。我只是不明白我如何從另一個類訪問getter和setter,因爲主活動的實例不存在(是嗎?)。我想你的意圖是對的,我真的需要徹底理解它們。我發現的所有教程只解釋瞭如何使用意圖在活動之間切換。 – MarcoSz 2011-04-25 21:09:09

+0

所以我不知道你的應用程序的結構,但我想你是說Main不是你創建Main1和Main2的Main對象的類,而是一個只存在於自身運行的類,這種情況下ImageView不會是實例變量,而是整個類的變量。在這種情況下,將getter和setter聲明爲靜態方法,以便您可以使用Main.getView()或其他任何方式訪問它們,就像訪問標準庫函數(如Math)一樣。最大()或類似的東西。在這種情況下,您還應該包括您的所有內容(請參閱下一個註釋) – 2011-04-25 21:27:09

+0

...在GetView方法中實例化ImageView(例如獲取R.id.yourlayout文件並使用GetViewbyID方法獲取ImageView) – 2011-04-25 21:27:53

相關問題