Android-навигация по вкладкам

Я использую новый навигационный ящик, доступный в библиотеке поддержки. При использовании выдвижного ящика вместе с вкладками под вкладками отображается меню выдвижного ящика, как показано ниже. Как я могу убедиться, что меню ящика отображается на вкладках. (Должно отображаться меню ящика, как будто нет вкладок)

Меню ящика без вкладок

Меню ящика с вкладками

Ответы на вопрос(9)

Создайте отдельный фрагмент, скажем, TabsFragment, и добавьте его в контейнер фрагментов в своей основной деятельности.

Вкладки могут быть добавлены внутрь фрагмента вкладок с помощью следующего кода.

private FragmentTabHost mTabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mTabHost = new FragmentTabHost(getActivity());
    mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.fragment1);

    mTabHost.addTab(mTabHost.newTabSpec("TabA").setIndicator("TabA"),
           TabA.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("TabB").setIndicator("TabB"),
            TabB.class, null);

    return mTabHost;
}

Здесь TabA и TabB являются отдельными фрагментами для вкладок. Вы можете реализовать свою функциональность соответствующих вкладок в соответствующих фрагментах. Ссылка :http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html

Я верю этому'Слишком поздно, так как вопрос был задан, но все же. Если вы уже используете навигационный ящик и хотите использовать вкладки навигации, включите два файла в папку проекта:

1) SlidingTabLayout.javahttp://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabLayout.html

2) SlidingTabStrip.javahttp://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabStrip.html

Во фрагмент навигационного блока включите следующее:

private SlidingTabLayout mSlidingTabLayout;
    private  SamplePagerAdapter_tasks mPagerAdapter;
    private ViewPager mViewPager;

    public void onViewCreated(View view, Bundle savedInstanceState) {
        // BEGIN_INCLUDE (setup_viewpager)
        // Get the ViewPager and set it's PagerAdapter so that it can display items
        //fragment manager of a fragment,Return a private FragmentManager for placing and managing Fragments inside of this Fragment.

        mPagerAdapter = new SamplePagerAdapter_tasks(getChildFragmentManager(),Titles of Tabs(array of string),Numboftabs (integer));
        mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        mViewPager.setAdapter(mPagerAdapter);

        // Give the SlidingTabLayout the ViewPager, this must be done AFTER the ViewPager has had
        // it's PagerAdapter set.
        mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);
        mSlidingTabLayout.setDistributeEvenly(true); // this helps to all the tabs on screen to take equal spaces (eg. if 3 tabs each would take one-third of the total space on the screen)

        mSlidingTabLayout.setViewPager(mViewPager);

        // END_INCLUDE (setup_slidingtablayout)
    }

Надеюсь, поможет!!

Решение Вопроса

У меня возникла та же проблема, и ответ, который я получил от Романа Нурика (команда Android), заключается в том, что не следует использовать Навигационный ящик с вкладками панели действий.

Обсуждение можно найти здесь:https://plus.google.com/u/1/116515063230772720916/posts/8dWEkFcbTFX

 Muhammad Babar10 июн. 2014 г., 08:09
Это явноплохо предназначенныйШаблон дизайна от Google 'с командой Android.
 Maxrunner30 июл. 2013 г., 17:51
Так, что использует приложение игр Google? если вы выберете «Мои игры» в ящике, на нем отобразится пейджер с индикаторами, а если вы нажмете еще раз, он появится над пейджером с индикаторами.
 user15327518 дек. 2013 г., 21:15
Это'Через 8 месяцев многие приложения Google все еще используют вкладки и панель навигации (Play, Music и YouTube, по крайней мере), поэтому яЯ предполагаю, что этот совет больше не актуален.
 Sauron19 дек. 2014 г., 00:26
@ Генри Где я могу найти, как создавать ручные вкладки?
 CQM28 апр. 2014 г., 21:03
Google»Вкладки приложений сделаны с использованием заголовков ViewPager. Различие заключается в том, как вкладки панели действий выглядят в альбомном режиме, вкладки панели действий перемещаются на самую верхнюю панель действий между заголовком и кнопками, а заголовки видового экрана - нет.
 Muhammad Babar10 июн. 2014 г., 08:11
Вместо того, чтобы исправить эту ошибку для всех, они использовали настроенную версию в своих собственных приложениях. Позор в Google!
 Henry17 янв. 2014 г., 00:56
@dpk На самом деле, полная цитата " Ты не должен• используйте навигационные ящики со вкладками панели действий. Если ты'Если вы стремитесь к пользовательскому интерфейсу, подобному интерфейсу Google Play Music, вы должны реализовать вкладки вручную. " Так что'Можно использовать вкладки с ящиком, но не вкладки панели действий. В приложении «Музыка» вы можете видеть, что они используют стиль навигации по блесне на панели действий для «Вся музыка" а также "На устройстве ", поэтому очевидно, что вкладок в библиотеке нельзявкладки панели действий ", а скорее пользовательские встроенные вкладки, которые неСлишком сложно.

Вы можете скрыть View, ответственный за рендеринг вкладок:

public static void setActionBarNavigationVisibility(Activity activity, boolean visible) {
    // --- If the Tabs are BELOW ActionBar (narrow screens) --- 
    int actionViewResId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android"); // @see http://stackoverflow.com/questions/20023483/how-to-get-actionbar-view
    View actionBarContainer = activity.findViewById(actionViewResId); // returns instance of com.android.internal.widget.ActionBarContainer (inaccessible)
    try {
        Field mTabContainerField = actionBarContainer.getClass().getDeclaredField("mTabContainer");
        if (mTabContainerField != null) {
            mTabContainerField.setAccessible(true);
            View mmTabContainer = (View) mTabContainerField.get(actionBarContainer);
            if (mmTabContainer != null)
                mmTabContainer.setVisibility(visible ? View.VISIBLE : View.GONE); // use GONE, so the mTabContainer below ActionBar does not take space in layout
        }
    } catch (Exception e) {
        // TODO handle exception
    }
}

Просто вызовите этот метод из вашей реализацииActionBarDrawerToggle как это:

public void onDrawerSlide(View drawerView, float slideOffset) {
        super.onDrawerSlide(drawerView, slideOffset);
        if (slideOffset == 0) { // 0 = drawer is closed             
            setActionBarNavigationVisibility(activity, true); //show Tabs when Drawer is closed             
        }
    }

public void onDrawerStateChanged(int newState) {
        super.onDrawerSt,ateChanged(newState);
        //hides Tabs right after Drawer starts opening
        if (DrawerLayout.STATE_DRAGGING == newState || DrawerLayout.STATE_SETTLING == newState) {
            setActionBarNavigationVisibility(activity, false);
        }
    }

Это решение будет прекрасно работать, если вы используете ActionBar.Tabs на узком экране (вкладки отображаются ниже НИЖЕ ActionBar). Но если вы хотите обработать все другие сценарии навигации (NavigationMode: List, CustomNavigationView или вкладки отображаются непосредственно в ActionBar), первый метод должен использовать все эти возможности:

public static void setActionBarNavigationVisibility(Activity activity, boolean visible) {
    try {
        /* 1. --- If the navigation items are showing in ActionBar directly. We have 3 options Spinner, Tabs, and CustomNav ---
         (When Tabs are showing BELOW ActionBar, is handled at the end) */
        int actionViewResId = Resources.getSystem().getIdentifier("action_bar", "id", "android"); // @see http://stackoverflow.com/questions/20023483/how-to-get-actionbar-view
        View actionBarView = activity.findViewById(actionViewResId); // returns instance of com.android.internal.widget.ActionBarView (inaccessible)
        if (actionBarView != null) {
            int visibility = visible ? View.VISIBLE : View.INVISIBLE; // not GONE, so it still takes space in ActionBar layout

            // handle tabs navigation
            Field mTabScrollViewField = actionBarView.getClass().getDeclaredField("mTabScrollView");
            if (mTabScrollViewField != null) {
                mTabScrollViewField.setAccessible(true);
                View mTabScrollView = (View) mTabScrollViewField.get(actionBarView); // instance of com.android.internal.widget.ScrollingTabContainerView (inaccessible)
                if (mTabScrollView != null)
                    mTabScrollView.setVisibility(visibility);
            }

            // handle Spinner navigation
            Field mSpinnerField = actionBarView.getClass().getDeclaredField("mSpinner"); // resp. mListNavLayout
            if (mSpinnerField != null) {
                mSpinnerField.setAccessible(true);
                View mSpinner = (View) mSpinnerField.get(actionBarView); // instance of android.widget.Spinner
                if (mSpinner != null)
                    mSpinner.setVisibility(visibility);
            }

            // handle Custom navigation
            Field mCustomNavViewField = actionBarView.getClass().getDeclaredField("mCustomNavView"); // resp. mListNavLayout
            if (mCustomNavViewField != null) {
                mCustomNavViewField.setAccessible(true);
                View mCustomNavView = (View) mCustomNavViewField.get(actionBarView);
                if (mCustomNavView != null)
                    mCustomNavView.setVisibility(visibility);
            }
        }
        // 2. --- If the Tabs are BELOW ActionBar (narrow screens) ---          
        ViewParent actionBarContainer = actionBarView.getParent(); // parent of ActionBarView is com.android.internal.widget.ActionBarContainer (inaccessible)
        Field mTabContainerField = actionBarContainer.getClass().getDeclaredField("mTabContainer");
        if (mTabContainerField != null) {
            mTabContainerField.setAccessible(true);
            View mmTabContainer = (View) mTabContainerField.get(actionBarContainer);
            if (mmTabContainer != null)
                mmTabContainer.setVisibility(visible ? View.VISIBLE : View.GONE); // now use GONE, so the mTabContainer below Actionbar does not take space in layout
        }

    } catch (Exception ex) {
        // TODO Handle exception...         
    }
}

В версии WordPress для Android реализована заявленная вами проблема.

Они разработали мнемоническую версию TabView под названием "HorizontalTabView», Почему они делают это точно так же, как то, что вам (и мне) нужно.

WordPress GitHub:https://github.com/WordPress/WordPress

Связанный источник:

HorizontalTabView.javaWPActionBarActivity.javaРез / theme_browser_activity.xml

Надеюсь, этот совет поможет.

В моем AppCompatActivity я добавляю это:

DrawerLayout drawerLayoutMenu =(DrawerLayout) findViewById(R.id.drawer_layout_menu);
RelativeLayout mDrawerPane =(RelativeLayout) findViewById(R.id.drawerPane);

И я называю это на значке меню панели инструментов

if (drawerLayoutMenu.isDrawerOpen(mDrawerPane)) {
    drawerLayoutMenu.closeDrawer(mDrawerPane);
} else {
        drawerLayoutMenu.openDrawer(mDrawerPane);
}

XML-файл



        

            

                

                

                

                
            
        

        

        

            

        

    

Панель действий Navigaton Drawer и SwipeTabs не могут использоваться одновременно. Вы должны реализовать Navigation Drawer, используя Actionbar и swipetabs с помощью простых Tabhosts. Вы можете использовать Tabhost для вкладок и фрагменты для внутреннего просмотра каждой вкладки. Фрагменты должны использоваться через viewpager для обеспечения эффекта прокрутки / прокрутки. Соедините вкладки и ViewPager друг с другом через их методы





    

        

            
            
        

        

            
        
    

 TechSpellBound07 апр. 2015 г., 19:04
TabHost работает только с активностями. Вы должны использовать FragmentTabHost для фрагментов. Также ViewPager не может быть размещен в месте, которое вы показали!

Вот решение, которое я использую, выглядит так (работает отлично): я использую макет фрейма, чтобы иметь возможность поменять фрагменты, а макет с вкладками - это вкладки базового фрагмента.

activity_main.xml



    
    
    
    

        

            

            
        
    

    


Я не уверен насчет вкладок панели действий, но вы можете использовать Pager Tab Strip в сочетании с Navigation Drawer, чтобы получить модель навигации, аналогичную Google Play Music, посмотрите намой пост

Ваш ответ на вопрос