2012-09-21 33 views
1

我試圖找出實現「祖先」和「時間」導航(利用向上按鈕和後退按鈕)的最佳方式,正在努力。Android - 使用ViewPager&Fragments進行時間和祖先導航

目前,用戶呈現一個viewpager,並且可以在三個主要片段(ArtistMain,AlbumMain和SongMain)之間進行頁面。在該視圖中選擇一個項目後,會發生片段事務,並且viewpager會從視圖中移出,並由新片段(AlbumSub,Songsub或player,取決於用戶來自何處)替換。用戶可以進一步瀏覽,直到選擇一首歌曲,然後將它們帶到「播放器」屏幕。

我想問的是:如何實現所有這些條件導航?

我對android和編程一般都比較陌生,我似乎無法想出一個有效的方法來實現這一點。目前,隨着每個片段進入視圖,應用程序正在檢查用戶剛剛從哪裏來,然後確定應該在用戶回到家還是在家時調用。這意味着我有一個像「fromArtistMain」,「fromAlbumSub」這樣的布爾值,並且我正在檢查諸如「fromSongSub & & fromPlayer」之類的東西......這一切都變成了一團糟。

我畫了一張圖(在油漆中,對不起!!),來描述我試圖實現的導航。黃色代表'上'按鈕按下,紅色代表'後退'按鈕按下,藍色代表正常導航。綠色箭頭是爲了表示視圖分頁:

Navigation Diagram

任何意見是值得歡迎的。這可能需要一些非常簡單的東西,我只是忽略了。

謝謝你的時間。

編輯:

我已經加入片段返回堆棧,並使用popBackStack()調用,問題是,彈出返回堆棧不一定在每種情況下的正確選擇。

我目前得到了一大堆代碼,試圖確定一個事務是否應該添加到第一個位置。

請考慮以下內容: 用戶從'SongMain'中直接選擇一首歌曲,並將其帶到'播放器'。現在使用主頁按鈕(在我的腦海中),將用戶帶到SongSub(所選歌曲所屬專輯中的歌曲列表)。現在,如果用戶再次導航,它們將被帶到'AlbumSub',該藝術家的專輯列表。這是一個片段交易,但增加到後臺將意味着用戶在後退時會被降低一級(我認爲這是意想不到的)。因此,在這種情況下,我不會將這個特定的事務添加到後臺堆棧 - 看起來很好,但是有不少情況,並且在需要進入和退出可見性的頂部的viewpager中,代碼變得非常真實亂。

所有這一切都意味着一大堆的條件語句確定該用戶來自和路徑他們採取到那裏的..

難道是明智的,有一幫在主機活動布爾其中獲得一組取決於用戶導航的位置,然後檢查這些布爾值以查看是否應該將事務添加到疊加中?這是我已有的東西,但它看起來效率很低。

回答

3

你在找什麼叫做Back stack。你可以在這裏閱讀更多關於developer.android.com。所以

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
    transaction.replace(R.id.container, fragment);  
    transaction.addToBackStack("NameOfFragment"); 
    transaction.commit();  

,如果你這樣做了:

如果你使用一個單一的活動舉辦這些片段的話可以修改代碼以使用像這樣的代碼的片段明確地添加到片段返回堆棧上面的代碼片段與像這樣:

Fragment1 -> Fragment2 -> Fragment3 -> Fragment4 

然後從Fragment4如果調用此方法:

getSupportFragmentManager().popBackStackImmediate(); 

然後Fragment4將完成並Fragment3將重新啓動。簡單。您可以通過單擊按鈕調用此行,或者您可以覆蓋後退按鈕的行爲來調用它。

請注意,在示例中,我使用了功能getSupportFragmentManager(),它是兼容包中的方法名稱。如果您不使用兼容性套件,則可以撥打getFragmentManager()

編輯

與你設想的導航的問題是,通過手段打破的堆棧中範式半路上,你的應用程序將「採取不同的」比操作系統的其餘部分。谷歌對此大加沮喪。但是再說一遍,說我在我的應用程序中完全一樣,原因非常類似:)。

當你沿着一條黃線瀏覽「向上」的時候,你正在跟隨一個離散的鏈接(如startActivity(new Intent(this, SongSub));或其他),並且你想要這個「打破」這個後臺堆棧。

這是在這個階段,你可以做一個關於要如何前進的決定:

  • 可以使用SongSub作爲第0項啓動任務(堆棧中)。這是來自記憶谷歌音樂應用程序做什麼,你是對的,這很煩人。當你按下它應該從技術上退出應用程序。育。國際海事組織,如果你是在一個明顯的頁面層次結構,回來應該總是導航沿着退出應用程序的層次結構。

  • 您可以使用ArtistMain作爲第0個元素開始一個新的任務,並在您的交易之前離散地分層分割片段,實際上每次「上」而不是「後退」時創建一個新的後臺堆棧(您的後臺堆棧會現在是ArtistMain-> ArtistSub-> SongSub)。這是我想你想在這裏問的。這是可能的,但它很混亂。

  • 您可以創建一個更線性的結構(如果可能,可能是最好的主意)。忽略backstack範例,使「back」和「up」總是無論你來自哪裏(球員總是去SongSub,SongSub總是進入AlbumSub),都會上升到一個水平。這將給用戶帶來最困惑和最透明(以及最容易實現)的體驗 - 用戶將快速學習如何導航(以及按下多少「背部」)以到達他們想要的位置。

+0

感謝您的回覆。請參閱我的編輯 - 這並沒有真正回答我的問題(我已經在使用fragmentManager堆棧)。 –

+0

編輯我的答案。 – Graeme

+0

感謝您的回答。 –