2009-10-19 70 views
10

我們正在編寫一個包含4個標籤的應用程序:Map,People,Places,Events。應用中的人物,地點和事件在地圖上顯示爲圖標。默認情況下,人物,地點和事件標籤分別顯示自定義渲染的列表視圖,分別顯示所有人物,地點和事件。Android - Tabs,MapView,標籤內的活動

alt text http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png

現在,右邊的標籤現在,每個都有其內容的意圖將推出相應的活動。例如,有一個擴展MapActivity的MapTabActivity,一個顯示人員的ShowPeopleListActivity,等等。

我看到一個lotofStackOverflowquestions /回答說,由於路上的各種限制的TabHost是設置,最好不要使用活動選項卡的內容。例如,不可能啓動一個新的活動,並且它不能取代選項卡中的現有活動,但可以用不同的視圖切換一個視圖。

現在,我正處於一個十字路口。我們已經(無論更好還是更糟糕)花費相當多的時間試圖讓這個應用程序按照它當前結構化的方式工作,其中Activities作爲選項卡的內容。當單擊與Person,Place或Event相對應的圖標時,它會在與該對象相對應的URI上觸發VIEW Intent;這是由一個活動,然後顯示該對象拾起。 Map和單個列表中都有相同的機制。我們非常喜歡這爲我們提供的鬆散耦合;我們只給出一個VIEW命令和URI給person/place/event,它會自動將我們帶入正確的活動。當然,推出的活動涵蓋了標籤視圖,而不是出現在內部,但我們願意接受這一點。

雖然這是一個問題:從Show活動中,我們希望能夠返回到地圖,集中在該人員,地點或事件。我們可以啓動一個新的活動來再次顯示地圖,但現在我們將地圖活動作爲選項卡的內容,再加上展示活動以及活動堆棧中的新地圖活動;鑑於地圖活動的資源密集程度如何,我猜這不是最理想的方式。

我想我的問題是,是否有一個好的教程在某處顯示如何使用TabHost完成複雜任務?我見過HelloTabWidget;我正在尋找比這更復雜的東西。我很擔心,如果我們切換到基於視圖的做事方式,我們將不得不做很多家務來攔截所有的後臺事件,嘗試切換視圖等等,以及以我們不想要的方式強烈地耦合我們的程序。

任何建議在前進的道路上將不勝感激。我們是Android的新手,所以我們試圖遵循既定的最佳實踐,但當我們看到的少數示例對我們的用例來說太簡單時,很難。

回答

7

我看到了很多的StackOverflow 的問題/回答說,在路上由於 各種限制的 TabHost是設置,最好不要使用 活動選項卡的內容。

作爲反活動選項卡聯盟(AATA)的自任總裁,這當然是我的立場。

當點擊相應於 人物,地點或事件的圖標,它 打完上對應於該對象中的URI 一個VIEW意圖;這是 由一個Activity拾取,然後 顯示該對象。

請注意,這與作爲標籤內容的活動無關。

我們可以推出一個新的活動再次顯示 地圖,但現在我們有地圖 活動爲標籤, 在活動堆棧中的內容加上演出活動,再加上新 地圖活動; 給出如何資源密集的地圖 活動是,我猜這不是 理想的方式去。

如果可能的話我會避免它。

我很擔心,如果我們切換到做事的 查看基於思路,我們將 不得不做家政的很多 攔截全部回事件,儘量 開關出來的意見等等,如 以及以我們不想要的方式強烈耦合我們的程序 。

這並不您以前寫的東西跟着可言。您的「後退事件」不會在使用視圖作爲標籤內容和使用「活動」作爲標籤內容之間改變一個iota。此外,這與您描述的「鬆耦合」模式沒有任何關係 - 單擊標籤中視圖中列表中的圖標與點擊活動中視圖中列表中的圖標沒有區別一個標籤。

只要有您的展會活動告訴,嗯,主要活動表現出特定的位置,然後顯示活動可以finish()。如果不在活動之間引入硬JVM耦合,最簡單的方法是在主要活動中廣播Intent並註冊BroadcastReceiver。收到此Intent後,主要活動將更新地圖並將其設置爲當前選項卡。當然,如果主要活動使用Views作爲其標籤內容,則此方法更簡單。

現在,如果您嘗試徹底檢查您的應用程序,例如在選項卡中導航不會啓動其他活動,而是將內容保存在其自己的選項卡中......這是一個完整的「一堆魚」。

+0

好的,我明白你的觀點,如果我們保持所有intents設置相同的方式,Show活動啓動,那麼back事件處理完全一樣。 所以我猜如果我們以編程方式切換標籤的內容而不是啓動的意圖,真正的複雜性(和後面的事件痛苦)將是。例如。通常顯示人員列表的人員選項卡被告知當點擊給定人員時切換到顯示人員視圖。在那種情況下,我們不得不自己處理一堆視圖? – I82Much

+0

此外,如何在標籤內沒有任何活動作爲標籤內容的地圖?那可能嗎? – I82Much

+0

w/r/t你的第一個評論,是的,你需要做你自己的堆棧管理。 w/r/t你的第二個評論,是的,你可以AFAIK。使您的主要活動成爲MapActivity而不是TabActivity。 TabActivity爲你做的唯一事情就是在你的TabHost上自動調用setup(),然後在添加任何TabSpecs之前你需要自己做。然後,MapActivity爲您提供將地圖放入選項卡所需的內容。這裏可能有問題,但是我認爲它應該可以正常工作。 – CommonsWare

8

這是一個很好的做法,爲您的選項卡提供一個活動和多個視圖。然而,這並不意味着你必須要小心處理選擇哪個選項卡,不同的菜單和上下文菜單爲每個標籤視圖等

我想我的問題是,是否有一個 很好的教程某處顯示 究竟如何做一個 TabHost複雜的任務?我見過HelloTabWidget;我 尋找更多的東西比這更復雜 。

我在博客上寫了一個稍微好一點的教程,演示了一個交互式ListView和MapView作爲選項卡。這裏是鏈接:Android Tabs with interacting map and list views

基本的是有一個佈局類似於HelloTabWidget教程中的佈局,使您的活動從MapActivity擴展,從XML中提取tabhost並確保您在tabhost上調用setup()。之後,添加視圖作爲標籤,標籤監聽器等的內容是相同的。

下面是類的簡短的出發點:

public class TabbedListMapActivity extends MapActivity { 

private ListView listView; 
private MapView mapView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    tabHost = (TabHost) findViewById(android.R.id.tabhost); 

    // setup must be called if not a TabActivity 
    tabHost.setup(); 

    // setup list view 
    listView = (ListView) findViewById(R.id.list); 

    // setup map view 
    mapView = (MapView) findViewById(R.id.mapview); 

    // add views to tab host 
    tabHost.addTab(tabHost.newTabSpec("List").setIndicator("List").setContent(new TabContentFactory() { 
     public View createTabContent(String arg0) { 
      return listView; 
     } 
    })); 
    tabHost.addTab(tabHost.newTabSpec("Map").setIndicator("Map").setContent(new TabContentFactory() { 
     public View createTabContent(String arg0) { 
      return mapView; 
     } 
    })); 
} 

...

+0

現在,這是一個很好的答案!謝謝喬希,你救了我的一天。 –

1

舉例來說,這是不可能的 推出了新的活動,並把它拿 現有的地方活動 在一個選項卡內,而有可能 用不同的 視圖切換出一個視圖。

我不認爲這是不可能的。我嘗試了這個想法,並寫了一篇博客article解釋我做了什麼。我在文章的最後列出了一個示例代碼項目,演示了我學到的一些有趣的東西。