Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从第三个片段导航时未加载第一个片段视图_Android_Android Fragments_Android Viewpager_Fragmentpageradapter - Fatal编程技术网

Android 从第三个片段导航时未加载第一个片段视图

Android 从第三个片段导航时未加载第一个片段视图,android,android-fragments,android-viewpager,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,在这里,当我登陆到第一个片段时,所有视图都被加载并滚动,但当我来自第三个片段,即来自其他一些活动时,我需要登陆到第三个片段,当导航到第一个片段时,视图没有加载,这使得不可滚动。 Firstfragment xml包含recyclerview和Group元素 我的活动类别: MyAdapter adapter = new MyAdapter(this, getSupportFragmentManager(), fragments); viewPager.setOffscr

在这里,当我登陆到第一个片段时,所有视图都被加载并滚动,但当我来自第三个片段,即来自其他一些活动时,我需要登陆到第三个片段,当导航到第一个片段时,视图没有加载,这使得不可滚动。 Firstfragment xml包含recyclerview和Group元素

我的活动类别:

    MyAdapter adapter = new MyAdapter(this, getSupportFragmentManager(), fragments);

        viewPager.setOffscreenPageLimit(3);

        viewPager.setAdapter(adapter);

        tabLayout.setupWithViewPager(viewPager);

//MyAdapter

    public class MyAdapter extends FragmentPagerAdapter {

    private Context mContext;
    private List<Fragment> fragmentList ;

    public MyAdapter(Context context, FragmentManager fm,List<Fragment> fragmentList) {
        super(fm);
        mContext = context;
        this.fragmentList = fragmentList;
    }

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

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return mContext.getString(R.string.firstfragmentname);
            case 1:
                return mContext.getString(R.string.seconsfrag);
            case 2:
                return mContext.getString(R.string.thirdfrag);

            default:
                return null;
        }
      }
    }

//XML has custom viewpager
<ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="@dimen/headerHeight"
            android:layout_marginBottom="@dimen/footerHeight"
            android:fadingEdgeLength="0dp">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_30_60"
                android:layout_marginTop="10dp"
                android:layout_marginEnd="@dimen/dp_30_60"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/sp_header"
                    style="@style/pageTitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_marginBottom="10dp"
                    android:text="@string/my_bill" />

                <com.view.Tab
                    android:id="@+id/tab_custom"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/tab_height" />

                <com.custom.CustomViewPager
                    android:id="@+id/sp_viewpager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginStart="@dimen/dp_10_53"
                    android:layout_marginTop="4dp"
                    android:layout_marginEnd="@dimen/dp_10_53"
                    android:layout_marginBottom="4dp" />
            </LinearLayout>
        </ScrollView>

//CustomViepager

    public class CustomViepager extends ViewPager {

    public CustomViepager(Context context) {
        super(context);
        initPageChangeListener();
    }

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

    private void initPageChangeListener() {
        addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                requestLayout();
            }
        });
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        View child = getChildAt(getCurrentItem());
        if (child != null) {
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
        }
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    }

    @Override
    public void setCurrentItem(int item) {
        super.setCurrentItem(item, false);
    }

    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        super.setCurrentItem(item, false);
     }
    }
MyAdapter adapter=newmyadapter(这个,getSupportFragmentManager(),fragments);
viewPager.setOffscreenPageLimit(3);
viewPager.setAdapter(适配器);
tabLayout.setupWithViewPager(viewPager);
//MyAdapter
公共类MyAdapter扩展了FragmentPagerAdapter{
私有上下文;
私有列表碎片列表;
公共MyAdapter(上下文上下文、FragmentManager fm、列表fragmentList){
超级(fm);
mContext=上下文;
this.fragmentList=碎片列表;
}
@凌驾
公共片段getItem(int位置){
返回碎片列表。获取(位置);
}
@凌驾
public int getCount(){
返回3;
}
@凌驾
公共字符序列getPageTitle(int位置){
开关(位置){
案例0:
返回mContext.getString(R.string.firstfragmentname);
案例1:
返回mContext.getString(R.string.seconfrag);
案例2:
返回mContext.getString(R.string.thirdfrag);
违约:
返回null;
}
}
}
//XML具有自定义的viewpager
//定制寻呼机
公共类CustomViepager扩展了ViewPager{
公共自定义寻呼机(上下文){
超级(上下文);
initPageChangeListener();
}
公共CustomViepager(上下文、属性集属性){
超级(上下文,attrs);
initPageChangeListener();
}
私有void initPageChangeListener(){
addOnPageChangeListener(新的ViewPager.SimpleOnPageChangeListener(){
@凌驾
已选择页面上的公共无效(内部位置){
requestLayout();
}
});
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
View child=getChildAt(getCurrentItem());
if(child!=null){
child.measure(widthmasurespec,MeasureSpec.makeMeasureSpec(0,MeasureSpec.unspected));
int h=child.getMeasuredHeight();
heightmeasspec=MeasureSpec.makeMeasureSpec(h,MeasureSpec.justice);
}
超级测量(宽度测量、高度测量);
}
@凌驾
公共无效setCurrentItem(int项){
super.setCurrentItem(item,false);
}
@凌驾
public void setCurrentItem(int项,布尔平滑滚动){
super.setCurrentItem(item,false);
}
}

使用一个简单的视图寻呼机,并尝试像这样使用它

定制页面雷达

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter

class MyPagerAdapter(fm: FragmentManager, behaviour: Int) : FragmentStatePagerAdapter(fm, behaviour) {

    private val mFragmentList = ArrayList<Fragment>()

    override fun getItem(position: Int): Fragment {
        return mFragmentList[position]
    }

    override fun getCount(): Int {
        return mFragmentList.size
    }

    fun addFragment(fragment: Fragment) {
        mFragmentList.add(fragment)
    }


}
onCreate中

mAdapter = MyPagerAdapter(getChildFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
mAdapter?.addFragment(YOUR_FIRST_FRAGMENT)
mAdapter?.addFragment(YOUR_SECOND_FRAGMENT)
mAdapter?.addFragment(YOUR_THIRD_FRAGMENT)

sp_viewpager.offscreenPageLimit = 3
sp_viewPAger.adapter = mAdapter
当你想降落到所需的位置时,在上面的代码编写之后

sp_viewpager.setCurrentItem(1/2/3,true/false)
对这个问题的回答是完美的

我只想强调一点,主要的技巧或真正的问题在于
屏幕外页面限制
是寻呼机在当前片段左侧或右侧创建的片段数,默认情况下该值为1

这就是为什么当我们滚动到第三个片段时,它不会加载任何内容,因为加载第三个片段将需要同时在左侧加载2个片段,通过更改
屏幕外页面限制
值,我们可以确定在这种情况下在特定时间加载的片段数量,即2个


如果我们这样做了,那么我们还必须覆盖PagerAdapter的默认函数
destroyItem()
在没有
super
的情况下使用空函数,这样就不会同时销毁和创建太多碎片,从而导致滑动不平稳或碎片为空。

使用FragmentStatePagerAdapter而不是FragmentStateAdapter您需要自定义视图吗pager@LakhwinderSingh如果我不将CustomViewpager用于在测量覆盖,然后无法看到布局,它是完全空白的屏幕。你认为会发生什么,如果你不使用自定义视图寻呼机,因为我不明白的使用onMesuare,你能指定吗
sp_viewpager.setCurrentItem(1/2/3,true/false)