当前位置: 首页 > 知识库问答 >
问题:

Adnroid ViewPager2包装异步片段子级的内容

贾骏
2023-03-14

我在一个滚动视图中得到了一个ViewPager2小部件,我想将其设置为类似于当前显示片段的内容的高度。片段包含一个网格视图或一个列表视图,其高度设置为wrap_content。
问题是,在创建片段视图后,网格视图会被内容填充,因此视图寻呼机的子高度为“0”。此外,每个片段的高度也可能与其他片段不同。
如果我将gridview高度设置为例如500dp,一切正常。
是否有某种监听器来检测gridview何时充满内容/gridview的高度更改为将viewpager heigth设置为类似于片段的高度?

我已经尝试了这里描述的解决方案
如何将Android ViewPager2的高度包装到当前项目的高度?
ViewPager2具有不同的项目高度和WRAP_CONTENT

布局:
ViewPager:

  <RelativeLayout>

    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/viewPagerID"               
        android:background="@color/light_blue">
    </androidx.viewpager2.widget.ViewPager2>

</RelativeLayout>

滚动视图:

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/top_navigation_view_bar"
        android:id="@+id/center"
        android:layout_above="@id/bottom_navigation_view_bar">

        <include layout="@layout/layout_viewpager"> </include>

 </ScrollView>

测试片段:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">


    <GridView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black"
        android:id="@+id/grid_fragment_0"
        android:verticalSpacing="2dp"
        android:horizontalSpacing="2dp"
        android:stretchMode="columnWidth"
        android:gravity="top"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp">
    </GridView>   


</RelativeLayout>

设置ViewPager

活动中的功能

private void setUpFragmentsTest(){
        String[] fragment_names = {"Fragment0", "Fragment1", "Fragment2"};

        mViewPager2 = (ViewPager2) findViewById(R.id.viewPagerID);
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        SectionsPagerAdapterNew sectionsPagerAdapterNew = new SectionsPagerAdapterNew(this);
        sectionsPagerAdapterNew.addFragment(new Fragment0());
        sectionsPagerAdapterNew.addFragment(new Fragment1());
        sectionsPagerAdapterNew.addFragment(new Fragment2());
        
        mViewPager2.setAdapter(sectionsPagerAdapterNew);

        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(
                tabLayout, mViewPager2, (tab, position) -> {
            tab.setText(fragment_names[position]);    

        });
        tabLayoutMediator.attach();
    }

节寻呼机适配器类:

public class SectionsPagerAdapterNew extends FragmentStateAdapter {

    private static final String TAG = "SectionsPagerAdapter";

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

    public SectionsPagerAdapterNew(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    public SectionsPagerAdapterNew(@NonNull Fragment fragment) {
        super(fragment);
    }

    public SectionsPagerAdapterNew(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }    

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return mFragmentList.size();
    }
    
    public void addFragment(Fragment fragment){
        mFragmentList.add(fragment);
    }   

}

共有1个答案

何涵衍
2023-03-14

所以我放弃了在xml布局中设置ViewPager2高度。在我的情况下,我只需要ViewPager覆盖任何导航都不使用的可用区域。因此,我根据显示大小和比例计算了视图页的高度像素,以适应顶部标题/TabLayout和底部导航(您将在下面的代码中看到)。

变化:

ViewPager2小部件:

 <RelativeLayout>

    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/viewPagerID"               
        android:background="@color/light_blue">
    </androidx.viewpager2.widget.ViewPager2>

</RelativeLayout>

活动内部的功能:

private void setUpFragmentsTest(){
        //SET UP THE VIEWPAGER THAT HOLDS THE PROFILE CONTENT FRAGMENTS
        String[] fragment_names = {"Fragment0", "Fragment1", "Fragment2"};

        mViewPager2 = (ViewPager2) findViewById(R.id.activity_profile_viewPager);
        TabLayout tabLayout = (TabLayout) findViewById(R.id.activity_profile_tab_layout);
        SectionsPagerAdapterNew sectionsPagerAdapterNew = new SectionsPagerAdapterNew(this);
        sectionsPagerAdapterNew.addFragment(new Fragment0());
        sectionsPagerAdapterNew.addFragment(new Fragment1());
        sectionsPagerAdapterNew.addFragment(new Fragment2());

        //SET THE VIEWPAGER HEIGHT RELATIVE TO THE DISPLAY METRICS & DISPLAY RATIO

        //GET THE METRICS & DISPLAY RATIO USED BY THE DIFFERENT NAVIGATION BARS
        ViewGroup.LayoutParams tabLayoutLayoutParams = tabLayout.getLayoutParams();
        ViewGroup.LayoutParams navigationViewLayoutParams = findViewById(R.id.bottom_navigation_view_bar).getLayoutParams();

        Resources resources = ProfileActivity.this.getResources();
        int androidTopBarID = resources.getIdentifier("status_bar_height", "dimen", "android");
        float androidTopBarHeight = resources.getDimensionPixelSize(androidTopBarID);



        //SETTING THE ACTUAL VIEWPAGER HEIGHT
        float pixelsUsedByNavigation = tabLayoutLayoutParams.height + (2* navigationViewLayoutParams.height);
        //2* navigationViewLayoutParams.height because I'm using a top and bottom navigation bar, if there is just 1 don't double that value
        ViewGroup.LayoutParams viewPagerLayoutParams = mViewPager2.getLayoutParams();
        DisplayMetrics displayMetrics = ProfileActivity.this.getResources().getDisplayMetrics();
        float viewpagerHeight;

        float ratio = ((float)displayMetrics.heightPixels / (float)displayMetrics.widthPixels);
            
        if(ratio > 1.667){
            //LONG DISPLAY RATIO
            viewpagerHeight = displayMetrics.heightPixels - pixelsUsedByNavigation;
        }

        else {
            //NOT LONG DISPLAY RATIO
            viewpagerHeight = displayMetrics.heightPixels - pixelsUsedByNavigation - androidTopBarHeight;
        }

        viewPagerLayoutParams.height = Math.round(viewpagerHeight);
        mViewPager2.setLayoutParams(viewPagerLayoutParams);
        mViewPager2.setAdapter(sectionsPagerAdapterNew);

        //SET UP THE TAB LAYOUT TO DISPLAY AND HIGHLIGHT THE CURRENT FRAGMENT NAME
        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(
                tabLayout, mViewPager2, (tab, position) -> {
            tab.setText(fragment_names[position]);

        });
        tabLayoutMediator.attach();


        
    }
 类似资料:
  • 我试图使(“父面板”)的内容从顶部向底部添加,并且使每个组件的宽度与父面板的宽度匹配,同时使每个组件的高度环绕内容。内容将动态生成。 这是我想要的样子: 这在Android中是相当容易做到的。我调查了Swing的布局经理,但他们似乎都不是一个明显的选择。我试过使用(vertical),除了面板没有填充父面板的宽度(这使它看起来非常糟糕)外,它还可以工作。 (注意使用GridBagLayout、Bo

  • 我有个问题。我有一个片段,里面包含了viewpager。对于viewpager,我使用FragmentPagerAdapter扩展。每个寻呼机片段内部都有回收器视图。问题是,在

  • 一个小背景:我的主要活动时,“在简历上”连接到我的服务器要求信息。这是正确的。当活动接收到答案时,它将数据加载到数组上,在加载完数组后,它调用位于主活动上的“updateFragments”。在这儿... DataManager类是:构造函数: 异步任务调用以下命令:

  • 我有嵌套片段,片段内部片段。使用NavigationBottomView。当我从父片段反压到子片段时,一切都正常。 但是现在,如果我在子片段中,突然我的手机屏幕熄灭,如果我再次打开屏幕并从我离开的地方反压,它不会消失,我想它是忘记或清除我的背包。不知道为什么。我在下面的github链接上做了一个演示 github演示链接在这里

  • 我对如何从这个网站将大量模板JSON数据加载到我的应用程序中而不减慢主UI线程感到非常陌生和困惑。我可以将要从JSON响应加载的数据加载到我的recycler视图中,但单击底部显示该数据的导航选项卡需要很长时间才能加载到页面上。 我明白这是因为数据没有正确加载到后台线程,这就是我感到困惑的地方。 我希望能够从后台任务返回一个ArrayList,并将填充的ArrayList作为我的recyclerv

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?