android-fragments 选项卡布局上的ViewPager未显示?

o4hqfura  于 2022-11-13  发布在  Android
关注(0)|答案(2)|浏览(178)

我只是做我的日常练习,我有一个问题。我已经创建了选项卡布局上的Viewpager,但它不工作。我不知道为什么,我只是做像在互联网上的教程,并为这个问题花了2天。:/
Tablayout显示所有标签,但不显示视图(片段标签)。
我会感谢你们所有人的帮助:))))))))
这是我编写的代码

内容_主目录.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>

查看页面活动:

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);
//    }
}

内容_主目录_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>
1sbrub3j

1sbrub3j1#

这个问题是由于在NestedScrollView中使用ViewPager造成的。当您使用CoordinatorLayout时,也可能会发生这个问题。您有两个选项可以解决这个问题。

1 .检视分页器2:

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

2 .使用自定义ViewPager:

这里有一个类,可以根据查尔兹来确定它的高度。

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"/>

相关问题