2014-02-18 2 views
14

Я искал, есть ли информация о том, как всегда отображать вкладки ActionBar под ActionBar, даже когда телефон ориентирован на пейзаж. Я знаю, что автоматически он помещает вкладки в ActionBar в зависимости от того, достаточно ли места на экране, чтобы соответствовать им, но я хочу, чтобы они всегда фиксировались под ActionBar даже в ландшафте. Я нашел аналогичный вопрос, который не дал окончательного ответа: How to display tabs below action bar. Я также знаю, что многие приложения Google, такие как; Google Play, Google Music и т. Д. Реализуют этот тип шаблона проектирования, поэтому он явно достижим и приемлем в качестве шаблона проектирования.Как всегда показывать вкладки ActionBar ниже ActionBar в Android

В настоящее время я использую библиотеку ActionBarSherlock для создания моей скользящей навигации вкладок, и я был бы очень признателен, если бы кто-нибудь понял, как это сделать. Заранее спасибо.

Вот мой код вида деятельности:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    viewPager = new ViewPager(this); 
    viewPager.setId(R.id.pager); 
    setContentView(viewPager); 

    tabsAdapter = new TabsAdapter(this, viewPager); // Declares the tabs adapter class with the view pager view 

    actionBarTabs = getSupportActionBar(); 
    actionBarTabs.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBarTabs.setCustomView(spinnerView); 
    actionBarTabs.setDisplayShowCustomEnabled(true);  

    /* Adds fragments to the tabs adapter */ 
    tabsAdapter.addTab(actionBarTabs.newTab().setText("FRAG1"), Fragment_1.class, null); 
    tabsAdapter.addTab(actionBarTabs.newTab().setText("FRAG2"), Fragment_2.class, null); 
    tabsAdapter.addTab(actionBarTabs.newTab().setText("FRAG3"), Fragment_3.class, null); 
} 

А вот мой TabsAdapter код:

public class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener , ViewPager.OnPageChangeListener 
{ 
private final Context context; 
private final ActionBar actionBar; 
private final ViewPager viewPager; 
private final ArrayList<TabInfo> tabsList = new ArrayList<TabInfo>(); 

/** 
* TabInfo class 
* 
* Static class containing the tab information. 
* 
* @since 1.0 
*/ 
static final class TabInfo 
{ 
    private final Class<?> clss; 
    private final Bundle args; 

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

/** 
* Tabs adapter overload constructor. 
* 
* @param fragmentActivity sets the fragment activity to the adapter. 
* @param refViewPager sets the viewPager variable. 
* @see 
* @since 1.0 
*/ 
public TabsAdapter(SherlockFragmentActivity fragmentActivity, ViewPager refViewPager) 
{ 
    super(fragmentActivity.getSupportFragmentManager()); 
    context = fragmentActivity; 
    actionBar = fragmentActivity.getSupportActionBar(); 
    viewPager = refViewPager; 
    viewPager.setAdapter(this); 
    viewPager.setOnPageChangeListener(this); 
} 

/** 
* Add tab method to add a tab to the list. 
* 
* @param tab sets the tab to be added to the tabs in the action bar. 
* @param clss sets the class variable in the TabInfo class. 
* @param args sets the bundle variable in the TabInfo class. 
* @see 
* @since 1.0 
*/ 
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) 
{ 
    TabInfo info = new TabInfo(clss, args); 
    tab.setTag(info); 
    tab.setTabListener(this); 
    tabsList.add(info); 
    actionBar.addTab(tab); 
    notifyDataSetChanged(); 
} 

@Override 
public void onPageScrollStateChanged(int state) 
{ 

} 

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
{ 

} 

@Override 
public void onPageSelected(int position) 
{ 
    actionBar.setSelectedNavigationItem(position); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) 
{ 
    viewPager.setCurrentItem(tab.getPosition()); 
    Object tag = tab.getTag(); 
    for (int i = 0; i<tabsList.size(); i++) 
    { 
     if (tabsList.get(i) == tag) 
     { 
      viewPager.setCurrentItem(i); 
     } 
    } 

} 

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

} 

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

} 

@Override 
public Fragment getItem(int position) 
{ 
    TabInfo info = tabsList.get(position); 
    return Fragment.instantiate(context, info.clss.getName(), info.args); 
} 

@Override 
public int getCount() 
{ 
    return tabsList.size(); 
} 
} 

ответ

3

Прежде всего, то, что вы описываете, как «многих приложений Google, например, Google Play, Google Music и т. Д. Реализуют этот тип шаблона проектирования. « не обязательно являются навигационными вкладками, связанными с ActionBar.

Существует множество реализаций, которые используют viewPager с индикатором заголовка. Для хорошей реализации обратитесь к библиотеке PagerSlidingTabStrip.

Кроме того, вы должны проверить официальную документацию по Android, где подробно рассказывается о навигации с вкладками, и показывает различные способы ее получения. Проверьте эти страницы в документации: Providing Descendant and Lateral Navigation и Creating Swipe Views with Tabs

Кроме того, есть много ответов на эту тему на stackoverflow.com. Библиотека, которую я предложил, уже упоминалась в этом ответе: https://stackoverflow.com/a/16544501/529138.

Проверить этот вопрос и связанные с ним ответы, а также: Tabs below action bar

Этих ресурсы должны быть достаточно, чтобы помочь вам с нужной функциональностью :)

+0

Большое спасибо. Я уже встречал эти ответы. Я также столкнулся с собственным классом Android [PagerTabStrip] (http://developer.android.com/reference/android/support/v4/view/PagerTabStrip.html), который, я думаю, можно использовать таким образом. Можно ли создать скользящую вкладку навигации, используя это вместе с ViewPager? –

+0

Да, это возможно. PagerTabStrip был создан для работы с ViewPager. Лично я никогда не использовал его.Я использую библиотеку ViewPagerIndicator от JakeWharton, но я проведу PagerTabStrip, когда у меня будет свободное время. В любом случае, я думаю, эта ссылка вам поможет: http://blog.pboos.ch/post/40575809334/android-pagertabstrip-viewpager – Bandreid

+0

Большое спасибо за вашу помощь. Я попробую его в какой-то момент и, пожалуйста, дайте мне знать, как это происходит, когда вы пытаетесь это сделать. –

12

я имел тот же проблемы с ландшафтным режимом и я нашел решение здесь : http://andreimihu.com/blog/2013/10/17/android-always-embed-tabs-in-actionbar/

В принципе, писателю нужна вкладка внутри панели действий, в то время как вы и я хотим ее на улице. Таким образом, просто измените вызов метода ложного (код по ссылке выше, но немного изменены):

// This is where the magic happens! 
public void forceTabs() { 
    try { 
     final ActionBar actionBar = getActionBar(); 
     final Method setHasEmbeddedTabsMethod = actionBar.getClass() 
      .getDeclaredMethod("setHasEmbeddedTabs", boolean.class); 
     setHasEmbeddedTabsMethod.setAccessible(true); 
     setHasEmbeddedTabsMethod.invoke(actionBar, false); 
    } 
    catch(final Exception e) { 
     // Handle issues as needed: log, warn user, fallback etc 
     // This error is safe to ignore, standard tabs will appear. 
    } 
} 
+0

У меня была такая же проблема, и функция работает так, как она должна быть, но другая проблема в том, что у меня есть только 2 вкладки, и они сдвинуты влево, есть ли способ заставить их оставаться в центре? –

+0

Он не работает в случае ActionBarSherlock. Есть ли у вас какие-либо идеи? –

+0

@arashmoeen Закладки обычно перемещаются влево и в центр, если в ландшафтном режиме. У меня сейчас нет ответа. –

1
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); 

actionBar.setLogo (нуль);

View homeIcon = findViewById(
      Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
        android.R.id.home : android.support.v7.appcompat.R.id.home); 
    ((View) homeIcon.getParent()).setVisibility(View.GONE); 
    ((View) homeIcon).setVisibility(View.GONE); 
Смежные вопросы