@lacredin
Программист

Как заставить работать ViewPager + TabLayout в ScrollView?

Здравствуйте.
Столкнулся с проблемой - ViewPager напрочь отказывается отображаться в ScrollView. При этом вне ScrollView всё работает как надо. Ошибок система никаких не выдаёт.
В попытка решить эту проблему я использовал решения с этих сайтов:
stackoverflow.com/questions/7381360/is-it-possible...
muratonnet.blogspot.ru/2014/01/android-viewpager-i...
и ещё нескольких не относящих на прямую к проблеме.

Вот шаблон layout для фрагмента в котором я вывожу ViewPager
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.strateg.test.NawigationDrawer"
    tools:showIn="@layout/app_bar_nawigation_drawer"
    android:id="@+id/main_layout">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <include layout="@layout/details_project_page"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></include>

    </ScrollView>

</FrameLayout>


Вот шаблон ViewPager + TabLayout (@layout/details_project_page)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/layout_details_page_project">
    <android.support.design.widget.TabLayout
       android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tab_layout_details_project"
        app:tabIndicatorColor = "@color/color_blue_text"
        app:tabIndicatorHeight="6dp"
        app:tabSelectedTextColor="@color/color_black_head_project_page"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
         />

    <android.support.v4.view.ViewPager

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/content_details_tabs_layout"
        app:layout_behavior = "@string/appbar_scrolling_view_behavior"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/tab_layout_details_project"
        android:fillViewport="true"
        android:forceHasOverlappingRendering="false"
        android:nestedScrollingEnabled="false"
        android:touchscreenBlocksFocus="false"
        android:transitionGroup="false">

    </android.support.v4.view.ViewPager>

</RelativeLayout>


Вот класс который управляет ViewPager + TabLayout
public class DetailsTabLayoutPageProject {

    private ViewPager content_details_tabs_layout;

    private void init_tabs()
    {

    }

    DetailsTabLayoutPageProject(FragmentManager fragmentManager, View parent)
    {
        content_details_tabs_layout = (ViewPager) parent.findViewById(R.id.content_details_tabs_layout);
        AdapterFragmentTabs adapter = new AdapterFragmentTabs(fragmentManager);
        content_details_tabs_layout.setAdapter(adapter);
        TabLayout tab_layout_details_project = (TabLayout) parent.findViewById(R.id.tab_layout_details_project);
        tab_layout_details_project.setupWithViewPager(content_details_tabs_layout );
    }

    class AdapterFragmentTabs extends FragmentPagerAdapter {
        private String tabs[];

        public AdapterFragmentTabs(FragmentManager fm) {
            super(fm);
            tabs = new String[]{
                    "1 вклвдка",
                    "2 вклвдка",
                    "3 вклвдка",
                    "4 вклвдка",
                    "5 вклвдка",
            };
        }

        @Override
        public Fragment getItem(int position) {
            switch (position)
            {
                default:return MyExampleFragment.getInstance();
            }
        }

        @Override
        public CharSequence getPageTitle(int position) {
            //return super.getPageTitle(position);
            return  tabs[position];
        }

        @Override
        public int getCount() {
            return tabs.length;
            //return 0;
        }
    }

    static class MyExampleFragment extends Fragment{
        private static final int LAYOUT = R.layout.description_project_page_fragment;
        private View view;

        public static MyExampleFragment getInstance()
        {
            Bundle args = new Bundle();
            MyExampleFragment fragment = new MyExampleFragment();
            fragment.setArguments(args);
            return fragment;
        }
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            view = inflater.inflate(LAYOUT, container, false);
            return view;
        }
    }
}


Подскажите пожалуйста, как заставить ViewPager отображаться в ScrollView.
Или возможно надо использовать другой контейнер вместо ScrollView.
Или предложите чем можно заменить связку ViewPager + TabLayout, но с таким же функционалом.
Или если у вас есть рабочий код в котором ViewPager отображается в ScrollView, то дайте пожалуйста на него ссылку, может смогу найти причину сравнивая код.
  • Вопрос задан
  • 903 просмотра
Решения вопроса 1
@lacredin Автор вопроса
Программист
ViewPager должен иметь фиксированную высоту когда находится в ScrollView. Соответственно, если нужна динамическая высота, то придётся изменять её из java кода.

В моём случае, так как ViewPager находится в другом layout файле, то устанавливать статическую высоту надо не ViewPager, а через который он подключается.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы