TabLayout 上的 ViewPager 不显示?

ViewPager on TabLayout not Showing?

我只是在做我的日常练习,我遇到了问题,我在选项卡布局上创建了 Viewpager,但它没有用。 我不知道为什么,我只是喜欢互联网上的教程,并花了 2 天时间来解决这个问题。 :/

Tablayout 显示所有选项卡但不显示视图(片段选项卡)。

非常感谢你们的帮助:))))))))

所以,这是我的代码,

content_home.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView 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:id="@+id/content_home"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".ui.home.ViewPagerActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/content_home_tablayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabBackground="@color/colorPrimaryAlternate"
            app:tabGravity="fill"
            app:tabMode="fixed"
            app:tabIndicatorColor="@color/colorPrimary"
            app:tabSelectedTextColor="@color/colorPrimary"
            app:tabTextColor="@color/colorPrimaryDarkAlternate"
            app:tabIconTint="@color/tab_color_selector"
            app:tabTextAppearance="@style/tabAllCaps">
            
            <com.google.android.material.tabs.TabItem
                android:id="@+id/tab1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:icon="@drawable/ic_waterpark"
                android:text="@string/waterpark" />

            <com.google.android.material.tabs.TabItem
                android:id="@+id/tab2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:icon="@drawable/ic_home_black_24dp"
                android:text="@string/drypark" />

            <com.google.android.material.tabs.TabItem
                android:id="@+id/tab3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:icon="@drawable/ic_human_male_female"
                android:text="@string/facilities" />
            
        </com.google.android.material.tabs.TabLayout>
        
        <androidx.viewpager.widget.ViewPager
            android:id="@+id/content_home_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/content_home_tablayout"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:layout_alignParentBottom="true" />

    </LinearLayout>

</androidx.core.widget.NestedScrollView>

ViewPagerActivity:

package com.ardityo.android.transeraapps.ui.home;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import com.ardityo.android.transeraapps.R;
import com.ardityo.android.transeraapps.ui.home.tabs.drypark.DryParkFragment;
import com.ardityo.android.transeraapps.ui.home.tabs.facilities.FacilitiesFragment;
import com.ardityo.android.transeraapps.ui.home.tabs.waterpark.WaterParkFragment;
import com.google.android.material.tabs.TabLayout;

public class ViewPagerActivity extends AppCompatActivity {

    private TabLayout tabLayout;

    private ViewPager viewPager;

    ViewPagerAdapter adapter;

    WaterParkFragment waterParkFragment;
    DryParkFragment dryParkFragment;
    FacilitiesFragment facilitiesFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_home);

        viewPager = (ViewPager) findViewById(R.id.content_home_viewpager);
        viewPager.setOffscreenPageLimit(3);

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

    }



    private void setupViewPager(ViewPager viewPager)
    {
        adapter = new ViewPagerAdapter(getSupportFragmentManager());

//        waterParkFragment=new WaterParkFragment();
//        dryParkFragment=new DryParkFragment();
//        facilitiesFragment=new FacilitiesFragment();
//        adapter.addFragment(waterParkFragment,"WaterPark");
//        adapter.addFragment(dryParkFragment,"DryPark");
//        adapter.addFragment(facilitiesFragment.newInstance(),"Facilities");

        adapter.addFragment(WaterParkFragment.newInstance(),"WaterPark");
        adapter.addFragment(DryParkFragment.newInstance(),"DryPark");
        adapter.addFragment(FacilitiesFragment.newInstance(),"Facilities");
        viewPager.setAdapter(adapter);
    }

}

DryParkFragment(与 WaterParkFragment 和 FacilitiesFragment 相同):

package com.ardityo.android.transeraapps.ui.home.tabs.drypark;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.ardityo.android.transeraapps.R;
import com.ardityo.android.transeraapps.ui.settings.SettingsViewModel;

public class DryParkFragment extends Fragment {

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

    public static DryParkFragment newInstance() {

        Bundle args = new Bundle();

        DryParkFragment fragment = new DryParkFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.content_home_2, container, false);
    }

//    @Override
//    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//        inflater.inflate(R.menu.menu_calls_fragment, menu);
//        super.onCreateOptionsMenu(menu, inflater);
//    }
}

content_home_2.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".ui.home.tabs.drypark.DryParkFragment"
    >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/mascot_head" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test" />

</LinearLayout>

尝试使用 viewpager2,不要忘记使用最新的库
-> https://developer.android.com/jetpack/androidx/releases/viewpager2?hl=id

问题来自在 NestedScrollView 中使用 ViewPager。当您使用 CoordinatorLayout 时也可能发生这种情况。您有两种选择来实现这一目标。

1。 ViewPager2 :

第一个选项是使用 ViewPager2 。看看吧: https://developer.android.com/jetpack/androidx/releases/viewpager2

2。使用自定义 ViewPager :

这里有一个class可以根据孩子判断身高的class

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

import androidx.viewpager.widget.ViewPager;

public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int biggestHeightMeasureSpec = 0;
        for(int i = 0 ; i < getChildCount() ; i++)
        {
            View child = getChildAt(i);
            if (child != null) {
                child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                int h = child.getMeasuredHeight();
                heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
                if(heightMeasureSpec >  biggestHeightMeasureSpec)
                    biggestHeightMeasureSpec = heightMeasureSpec;
            }
        }
        super.onMeasure(widthMeasureSpec, biggestHeightMeasureSpec);
    }

}

终于在您的 XML 布局中使用它了:

        <PATH.TO.YOUR.CustomViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>