2013-10-14 4 views
3

У меня есть активность в полноэкранном режиме. В этом упражнении находится ActionBar с 4 вкладками. Моя проблема в том, что я хотел бы «смоделировать» свою собственную панель статусов в верхней части действия. Но я не могу добавить представление над панелью состояния.android add Просмотр выше ActionBar

Когда я устанавливаю пользовательское представление в ActionBar (и устанавливаю .setDisplayShowHomeEnabled (true)), он в основном работает - пользовательский вид находится над вкладками ActionBar-Tabs. Но на этом soluton я не могу контролировать высоту пользовательского представления - он всегда статически имеет ту же высоту.

У вас есть идеи решить эту проблему?

Спасибо много и наилучшие пожелания Tobi

ответ

0

Если вы хотите, вы можете сделать это избегая действия бара

Вместо того чтобы использовать панель действий создать линейный или относительный макет, как у вас есть панель действий.

Дайте макету фиксированную высоту точно так же, как панель действия. Вы можете найти точную высоту панели действий для разных сценариев из трафарета в zip. http://developer.android.com/downloads/design/Android_Design_Downloads_20130814.zip

Затем используйте Tabhost с фрагментами для отображения вкладок, так как табус можно разместить в любом месте, где вы можете использовать их, как хотите.

Если вы хотите продолжить этот путь, дайте мне знать, я помогу вам с кодом табуста для отображения вкладок.

Вот пример кода TAbhost с фрагментами

1.> Добавьте это в 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> 

Вы также можете заменить второй framelayout с ViewPager обеспечить swipable вкладок, Если вы планируете это сделать, не изменяйте идентификатор, просто замените тег FrameLayout на viewpager

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

. Ahh okay :-) Есть ли у вас пример, как установить tabhost в операции с фрагментами? – user2878719

Смежные вопросы