2013-10-14 40 views
3

我有一個在全屏模式下的活動。活動中有一個帶有4個選項卡的ActionBar。 我的問題是,我想在活動的頂部「模擬」我自己的狀態欄。但是我無法在狀態欄上添加視圖。android add查看上面ActionBar

當我將自定義視圖設置爲ActionBar(並設置.setDisplayShowHomeEnabled(true))時,它基本上可以工作 - 自定義視圖位於ActionBar-Tabs之上。但在這個解決方案中,我無法控制自定義視圖的高度 - 它總是靜態的高度。

你有什麼想法來解決這個問題嗎?

感謝很多和問候 託比

回答

0

如果你願意,你可以這樣做避免了操作欄

而不是使用操作欄創建一個線性或相對佈局就像你有你的動作條。

給佈局一個固定的高度完全相同的行動欄。您可以從壓縮模具中的不同場景中找到操作欄的確切高度。 http://developer.android.com/downloads/design/Android_Design_Downloads_20130814.zip

然後使用帶有碎片的Tabhost來顯示選項卡,因爲tabhost可以放在任何你可以隨意使用它們的地方,但是你想要。

如果你想繼續這樣,讓我知道我會幫你用tabhost代碼來顯示選項卡。

這裏是片段

1. TAbhost示例代碼>添加到您的XML

<TabHost 
     android:id="@android:id/tabhost" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="56dp" 
     android:layout_weight="0" 
     android:background="@null" 

     /> 

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="0"/> 

    <FrameLayout 
     android:id="@+android:id/realtabcontent" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 

</LinearLayout> 

你也可以用viewpager更換第二的FrameLayout提供滑動式標籤,如果你打算這樣做,那麼不要更改id只是用viewpager替換FrameLayout標籤

2.>將此代碼放入您的活動

mTabHost = (TabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 


    mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent); 

    mTabManager.addTab(
      mTabHost.newTabSpec("fragment1").setIndicator("Fragment1"), FragmentOne.class, 
      null); 
    mTabManager.addTab(
      mTabHost.newTabSpec("fragment2").setIndicator("Fragment2"), 
      FragmentTwo.class, null); 

    if (savedInstanceState != null) { 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
    } 

} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("tab", mTabHost.getCurrentTabTag()); 
} 

/** 
* This is a helper class that implements a generic mechanism for 
* associating fragments with the tabs in a tab host. It relies on a trick. 
* Normally a tab host has a simple API for supplying a View or Intent that 
* each tab will show. This is not sufficient for switching between 
* fragments. So instead we make the content part of the tab host 0dp high 
* (it is not shown) and the TabManager supplies its own dummy view to show 
* as the tab content. It listens to changes in tabs, and takes care of 
* switch to the correct fragment shown in a separate content area whenever 
* the selected tab changes. 
*/ 
public static class TabManager implements TabHost.OnTabChangeListener { 
    private final FragmentActivity mActivity; 
    private final TabHost mTabHost; 
    private final int mContainerId; 
    private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>(); 
    TabInfo mLastTab; 

    static final class TabInfo { 
     private final String tag; 
     private final Class<?> clss; 
     private final Bundle args; 
     private Fragment fragment; 

     TabInfo(String _tag, Class<?> _class, Bundle _args) { 
      tag = _tag; 
      clss = _class; 
      args = _args; 
     } 
    } 

    static class DummyTabFactory implements TabHost.TabContentFactory { 
     private final Context mContext; 

     public DummyTabFactory(Context context) { 
      mContext = context; 
     } 

     @Override 
     public View createTabContent(String tag) { 
      View v = new View(mContext); 
      v.setMinimumWidth(0); 
      v.setMinimumHeight(0); 
      return v; 
     } 
    } 

    public TabManager(FragmentActivity activity, TabHost tabHost, 
      int containerId) { 
     mActivity = activity; 
     mTabHost = tabHost; 
     mContainerId = containerId; 
     mTabHost.setOnTabChangedListener(this); 
    } 

    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) { 
     tabSpec.setContent(new DummyTabFactory(mActivity)); 
     String tag = tabSpec.getTag(); 

     TabInfo info = new TabInfo(tag, clss, args); 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     info.fragment = mActivity.getSupportFragmentManager() 
       .findFragmentByTag(tag); 
     if (info.fragment != null && !info.fragment.isDetached()) { 
      FragmentTransaction ft = mActivity.getSupportFragmentManager() 
        .beginTransaction(); 
      ft.detach(info.fragment); 
      ft.commit(); 
     } 

     mTabs.put(tag, info); 
     mTabHost.addTab(tabSpec); 
    } 

    @Override 
    public void onTabChanged(String tabId) { 
     TabInfo newTab = mTabs.get(tabId); 
     if (mLastTab != newTab) { 
      FragmentTransaction ft = mActivity.getSupportFragmentManager() 
        .beginTransaction(); 
      if (mLastTab != null) { 
       if (mLastTab.fragment != null) { 
        ft.detach(mLastTab.fragment); 
       } 
      } 
      if (newTab != null) { 
       if (newTab.fragment == null) { 
        newTab.fragment = Fragment.instantiate(mActivity, 
          newTab.clss.getName(), newTab.args); 
        ft.add(mContainerId, newTab.fragment, newTab.tag); 
       } else { 
        ft.attach(newTab.fragment); 
       } 
      } 

      mLastTab = newTab; 
      ft.commit(); 
      mActivity.getFragmentManager().executePendingTransactions(); 
     } 
    } 

這你沒有改變,除了在addTab方法的任何片段,將您的片段有一個正在運行的代碼。

對於每個片段,您都調用addTab方法。

+0

非常好的主意。我讀過TabHost已被棄用,我們應該在一段時間之前使用ActionBar。是這樣嗎? – user2878719

+0

TabActivity已被刪除,這與之前使用TabHost但TabHost不被棄用,你可以使用它與片段 – Ravi

+0

啊好吧:-)你有一個例子如何設置一個tabhost在一個活動的片段? – user2878719