2011-03-16 34 views
7

我有一個帶有三個選項卡的tabhost。每個都是一項活動。我想有一個按鈕,它位於操作欄中,頂部帶有常用按鈕的欄,用於激活標籤的調用功能。Android:如何調用Tabhost中的Activity選項卡的功能

例如,一個添加功能可以爲每個標籤添加不同的內容,具體取決於您單擊該按鈕時顯示的標籤。

因此,我正在aksing如何從tabHost調用Activity A中的函數。

如果不行,我可以從tabhost更新數據庫,然後刷新標籤內容。那會更容易嗎?

謝謝大家的時間和支持。

回答

7

嗨剛剛偶然發現這一點,不知道你是否已經找到了解決方案?

我最近自己解決了這個問題。我以前通過從tabhost活動提取意向廣播並在子選項卡活動內接收廣播來解決問題。這對我有用,但我確定有一個「更好」的方式。

一個更清潔的方式是像這樣的東西來實現它:

可能是這樣的:

  • parentActivity - 我的 「容器」 活性,其持有TabHost
  • childActivity - 我標籤活動 其中包含標籤內容和 我想調用的公共方法 parentActivity

內parentActivity:

// a method used for onclick callback or whatever you need. within parentActivity (tabhost) 
// this will get call huzzah() in the first tab - getChildAt(0) 
onClick() { 
    childActivity childAct = (childActivity) getTabHost().getChildAt(0).getContext(); 
    childAct.huzzah(); 
} 

內childActivity:

// a public method for the parent activity to access 
public void huzzah() { 
    Log.d("stuff", "huzzah() called"); 
} 

注:另一種選擇,我相信是重新設計使用的意見,而不是活動,你的標籤。這是一個更好的整體選擇,因爲IIRC內存明智的你只在堆棧上存儲1個活動,而不是(n * tabs)的活動數量

希望幫助

+1

嗨wired00,我試圖實現這個解決方案,但得到一個ClassCastException。我基本上覆制了你的代碼,但這裏是我的副本,以防萬一: \t \t \t SearchActivity childAct =(SearchActivity)getTabHost()。getChildAt(0).getContext(); \t \t \t childAct.changeStateTo(1);在這段代碼中,SearchActivity是類的名稱,而changeStateTo()是被調用的公共方法。有任何幫助? – Rockmaninoff 2011-06-14 23:07:52

+1

onClick是錯誤的代碼。返回沒有兒童活動,但tabhost的子視圖 - LinearLayout – 2012-01-19 22:29:59

+0

嗨@Rockmaninoff,我面臨同樣的問題。你得到任何解決方案? – 2014-03-19 12:18:30

13

我用我的TabActivity類中下面的代碼開關選項卡,然後調用標籤的活動定義的公共方法:

getTabHost().setCurrentTab(0); 
Activity MyActivity = this.getCurrentActivity(); 
MyActivity.myMethod(); 

的人尋找這個問題的答案我希望有所幫助。

+0

謝謝,我試試下次... – trgraglia 2011-06-24 15:01:39

+1

這工作就像一個魅力:)另一個給了我,classCastException ... – codemonkeybr 2011-08-11 22:41:59

+0

@dan k:嗨我創建3個活動的意圖(我添加到TabHost)在我的主TabActivity。我也有刷新tabhost佈局,點擊這個刷新按鈕我想刷新意圖活動/ currrent選項卡活動列表,通常公共方法稱爲像你說的,但在其他情況下,它顯示conext問題...任何想法結束這個? – CoDe 2012-07-09 01:53:55

0

市價修改彼得O請求:

我在API 10,而這個問題給了我一個巨大的頭痛。我有3個選項卡,我希望他們所有人都知道另一方面的變化。我遇到的問題是,一旦選項卡的活動啓動,似乎沒有回叫,因此活動理解用戶切換到不同的選項卡,因此需要進行工作以確保其狀態正確。

我發現很多這個問題的答案,但似乎沒有工作。

我終於開始工作的那個解決方案就是爲這個線程提供的#3,但它也令人困惑。我發現getTabHost()。setCurrentTab(0);什麼也沒做;我實現了OnTabChangeListener()來調用一個使用getTabHost()的函數。setCurrentTab(0);但是,我發現getTabHost()。setCurrentTab(0);導致應用程序崩潰爲0以外的任何選項卡 - 例如,如果我選擇了選項卡B(index = 1),然後調用getTabHost()。setCurrentTab(1);該應用程序崩潰。

使用調試器,我發現調用this.getCurrentActivity();總是返回與用戶點擊的標籤關聯的活動 - 調用getTabHost()。setCurrentTab();沒有改變這個事實,並導致應用程序崩潰。

所以我擺脫了它,我現在可以調用this.getCurrentActivity(),然後調用該調用返回的Actvitity類中的方法 - 這讓活動知道它必須更新它的狀態 - 在我的它使用應用程序對象執行此操作。

+1

這個答案有點混亂。你能格式化它並編輯它,因此它可以作爲一個更好的答案嗎?例如,什麼是「上面的代碼?」 (答案可以按不同的順序排序,因此提及「上方」的答案可能不正確。) – 2012-03-14 21:08:22

+0

我同意彼得的觀點。歡迎來到SO Derwood,感謝您的迴應,但學習格式將幫助您獲得更多認可並獲得更好的反饋。至於0以外的選項卡上的錯誤...聽起來像別的東西正在導致錯誤。 – trgraglia 2012-03-19 09:31:54

0

調用該方法將無法正常工作的上述方式,

這裏是上述問題的快速回答:

getTabHost().setCurrentTab(0);

Activity myActivity=getCurrentActivity();

String name=((Tab1) myActivity).et1.getText().toString();

這裏上面的代碼在onclick()的活動方法中給出TahHost 其中Tab1是第二個活動,et1是Tab1活動中edittext的標識,因此您可以單獨獲取不同字段的所有值。

相關問題