2012-10-23 72 views
7

我正在尋找與sherlock操作欄一起使用選項卡導航的最佳做法。 什麼是正確的方式更改片段,並添加片段到堆棧和清除後堆棧時選擇另一個選項卡。標籤導航的最佳做法?

是否有任何好的示例或開源項目顯示如何正確使用它?

回答

6

我不會直接使用ABS來做到這一點。一旦你的標籤需要分片切換等,你會遇到麻煩。我認爲正確的做法是使用ViewPagerIndicator,它與ABS兼容。作爲獎勵,您還可以在選項卡之間左右滑動。 您需要compat軟件包(例如ABS),您可以在 samples folder中找到示例用法。

+0

但是,有沒有辦法片段添加到一個視圖尋呼機返回堆疊?現在我正在爲每個選項卡管理自己的片段堆棧。 – meh

+0

我還沒有這樣的情況。我想這很大程度上取決於你如何希望後臺行爲。如果您只想在選項卡中保留歷史記錄,則可以註冊更改頁面事件並清除後臺堆棧。如果你希望後退按鈕也能讓你回到其他標籤中,它肯定會變得更加複雜。但是,使用本地標籤方法也不應該這麼容易。 – stoilkov

+0

能否請您添加到您的答案實現ViewPagerIndicator的一些基本的例子嗎? 什麼包,我需要使用它的工作像2.2較舊的Android版本。 – meh

6

埃德加·提到android navigation guide是一個良好的開端。但讓我添加一些意見,以標籤如何打算與Android的工作。

新的acitonbar選項卡應該以與在Google Play應用中工作的方式相同的方式實現。這意味着一旦你想要一個標籤內的一些內容的一些細節,你會去一個新的視圖/片段/活動和標籤將消失。

所以android的標籤不應該始終可見,但只能在頂級層次結構中顯示。如果您想要簡化用戶的導航,您需要實施向上按鈕,以便用戶可以快速返回到頂部層次結構,其中標籤可見。

教程和樣本

我個人最喜歡的例子和教程是關於谷歌網頁上的動作條教程下tabs tutorial

標籤導航的示例也可以在android-sdk附帶的示例項目中找到。轉到:android-sdk\extras\android\support\samples\Support4Demos\src\com\example\android\supportv4\app 並尋找:FragmentTabs.javaFragmentTabsPager.java

如果您想使用ActionBarSherlock,您也可以使用download ActionBarSherlock並查看/ samples目錄中的samples文件夾。在那裏你有TabNavigation.javaTabNavigationCollapsed.java標籤演示。雖然我認爲你應該給Actionbar教程一個鏡頭。

標籤背部棧

還可以說你想有一個是可見的所有(但不建議它)的時間標籤欄。然後,您必須爲每個選項卡創建一個自定義備用堆棧,您可以查看here以獲取如何實現該選項的示例。

地圖和標籤

看看使用地圖的所有谷歌應用程序。谷歌使用溢出操作欄按鈕來瀏覽。因此,如果任何人想要這樣做,我們應該像開發人員一樣,但使用Google mapsv2 for Android標籤與地圖變得更容易。

+0

它真的幫助我!謝謝! –

1

我已經做了ActionbarSherlock與碎片和標籤多次,它的工作奇妙。

你需要一個TabListener:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.Tab; 
import com.android.wifilogger.R; 

public class WifiTabListener implements ActionBar.TabListener { 
     public Fragment fragment; 
     public MainTabActivity act; 

     public WifiTabListener(Fragment fragment, MainTabActivity act) { 
     this.fragment = fragment; 
     this.act = act; 
     } 


     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      ft.replace(R.id.root, fragment); 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      ft.remove(fragment); 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     } 
} 

和設置TabActivity:

public class MainTabActivity extends SherlockFragmentActivity { 

public ActionBar actionBar; 
private ActionBar.Tab listTab; 
public MenuItem refreshItem; 
private SherlockFragment listFragment; 
private SherlockFragment mapFragment; 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // getActionBar().setDisplayHomeAsUpEnabled(true); 


    actionBar = getSupportActionBar(); 

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    setContentView(R.layout.main); 

    ActionBar.Tab settingsTab = actionBar.newTab().setText("Settings") 
      .setTag("settings"); 
    listTab = actionBar.newTab().setText("Wifi List") 
      .setTag("list"); 
    ActionBar.Tab mapTab = actionBar.newTab().setText("Map").setTag("map"); 

    SherlockFragment settingsFragment = new SettingsFragment(); 
    listFragment = new WifiListFragment(); 
    mapFragment = new WifiMapFragment(); 

    settingsTab.setTabListener(new WifiTabListener(settingsFragment, this)); 
    listTab.setTabListener(new WifiTabListener(listFragment, this)); 
    mapTab.setTabListener(new WifiTabListener(mapFragment, this)); 

    actionBar.addTab(listTab,false); 
    actionBar.addTab(mapTab,false); 
    actionBar.addTab(settingsTab,false); 
    actionBar.selectTab(listTab); 

} 

,你必須改變SettingsFragment,MapFragment和ListFragment到自己的片段。您也可以在此tabfragments一個由USNG setTargetFragment添加DialogFragment但是這不是你的問題,我猜。