TabLayout вообще не заполняется ViewPager - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь заполнить TabLayout ViewPager, но, к сожалению, он не заполняется.

Я следовал этому руководству, чтобы связаться: TabLayout и ViewPager в вашем приложении для Android . В этом руководстве используется старая библиотека поддержки версии 4. Мой проект основан на AndroidX, и я хочу остаться с ним. Официальная документация из TabLayout говорит, что мне нужно создать TabLayout внутри ViewPager, но это совсем не работает. Поэтому я создал следующий XML-файл макета :

<LinearLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/primaryColor"
            app:tabGravity="fill"
            app:tabMode="fixed"
            app:tabTextColor="@color/primaryTextColor" />

    </androidx.viewpager.widget.ViewPager>

</LinearLayout>

I настроить ViewPager со следующими строками для соединения TabLayout с ViewPager:

public class MyActivity extends AppCompatActivity {
    ...
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);
        ...
        // tab layout
        ViewPager viewPager = findViewById(R.id.viewpager);
        MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(this, getSupportFragmentManager());
        viewPager.setAdapter(adapter);
        TabLayout tabLayout = findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);
        ...
    }
    ...
}

Мой Адаптер является FragmentPagerAdapter

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    private Context context;

    public MyFragmentPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        this.context = context;
    }

    @Override
    public Fragment getItem(int position) {
        if (position == 0) {
            return new MyFragment1();
        } else {
            return new MyFragment2();
        }
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return context.getString(R.string.building);
            case 1:
                return context.getString(R.string.buff);
            default:
                return null;
        }
    }
}

Один из моих Fragment выглядит следующим образом:

public class MyFragment1 extends Fragment {

    public MyFragment () {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_building, container, false);
    }

}

Вот картинка как это выглядит:

Пустой ViewPager

Вопрос

Так почему же TabLayout не заселен вообще? Я работаю с Android Studio и Менеджер дизайна просто показывает мне пустые TabLayout и ViewPager. Я думаю, это прекомпилирует TabLayout, но он просто пуст ...

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

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 08 июня 2019
  1. Поместите ваш TabLayout внутрь вашего ViewPager, как показано ниже.
<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <com.google.android.material.tabs.TabLayout xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabBackground="@color/colorPrimaryDark"
        app:tabGravity="fill"
        app:tabIndicatorColor="@color/colorPrimaryLight"
        app:tabMaxWidth="0dp"
        app:tabMode="scrollable"
        app:tabRippleColor="@color/colorPrimaryLight"
        app:tabSelectedTextColor="@color/colorPrimaryLight"
        app:tabTextColor="@android:color/white" />
</androidx.viewpager.widget.ViewPager>

убедитесь, что android:layout_height вашего TabLayout установленодо wrap_content.

Когда вы помещаете свой TabLayout в ViewPager, вам не нужно держать строки ниже:

TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);

Все остальное в вашем коде правильно.

Кроме того, теперь, когда я вижу ваш код, layout_height вашего TabLayout установлен на match_parent, поэтому TabLayout занимает все пространство на вашем экране, не давая высотыViewPager, также, в вашем XML нет контейнера для хранения ваших ViewPager и TabLayout (например, LinearLayout, FrameLayout и т. Д.).

0 голосов
/ 10 июня 2019

Я нашел решение в другом потоке Использовать макет табуляции в архитектуре MVVM с библиотекой привязки данных . Я использую привязку данных Android, поэтому TabLayout не было присвоено ViewPager. Поэтому мой код был верным, но не соответствовал привязке данных.

Тем не менее, спасибо за ваши сообщения здесь!

0 голосов
/ 08 июня 2019
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="scrollable"
        app:tabGravity="fill"
        style="@style/Base.Widget.Design.TabLayout"/>
</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"  />

viewPager = (ViewPager)rootView. findViewById(R.id.viewpager);
  ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
    adapter.addFragment(new FragAllONE(), "ONE");
    adapter.addFragment(new FragAllTWO(), "TWO");
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(1);
    viewPager.setCurrentItem(0);
    viewPager.addOnPageChangeListener(this);

    tabLayout = (TabLayout)rootView. findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

private class ViewPagerAdapter extends FragmentStatePagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
  return mFragmentList.get(position)
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object object = super.instantiateItem(container, position);
        if (object instanceof Fragment) {
            Fragment fragment = (Fragment) object;
            String tag = fragment.getTag();

        }
        return object;
    }

    public void restoreState(Parcelable state, ClassLoader loader) {

    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

}
0 голосов
/ 08 июня 2019

Вот пример из одного из моих проектов. Создайте и заполните ViewPager, примерно так:

 <androidx.viewpager.widget.ViewPager
    android:id="@+id/loginViewPager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toBottomOf="@id/loginTitle">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/loginTabContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        app:tabIndicatorColor="@color/colorPrimary"
        app:tabRippleColor="@color/colorPrimary"
        app:tabSelectedTextColor="@color/colorPrimaryDark"
        app:tabTextAppearance="@style/TabLayoutTheme">

        <com.google.android.material.tabs.TabItem android:text="first tab" />
        <com.google.android.material.tabs.TabItem android:text="second tab" />

    </com.google.android.material.tabs.TabLayout>
</androidx.viewpager.widget.ViewPager>

Затем в своей деятельности создайте FragmentStatePagerAdapter, чтобы решить, что возвращать на каждой странице.,мои коды в kotlin, но версия java такая же:

    private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
    override fun getCount(): Int = NUM_PAGES
    override fun getItem(position: Int): Fragment = when (position) {
        1 -> FirstFragment()
        0 -> SecondFragment()
        else -> FirstFragment()
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return when (position) {
            0 -> "First Title"
            1 -> "Second Title"
            else -> "First Title"
        }
    }
}

И, наконец, в вашей активности:

    val pagerAdapter = ScreenSlidePagerAdapter(supportFragmentManager)
    loginViewPager.adapter = pagerAdapter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...