Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.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 加载几页后如何设置OffScreenPageLimit()?_Android_Android Fragments_Android Viewpager_Fragment - Fatal编程技术网

Android 加载几页后如何设置OffScreenPageLimit()?

Android 加载几页后如何设置OffScreenPageLimit()?,android,android-fragments,android-viewpager,fragment,Android,Android Fragments,Android Viewpager,Fragment,我有一个相对复杂的布局,可以在viewpager中重用,有5页。viewpager位于父片段中 我的问题是,如果我不使用setOffscreenPageLimit(4)我的viewpager在浏览页面时会变得非常口吃,因为片段没有及时加载。缺点是,如果我使用setOffscreenPageLimit(4),我的父片段需要很长时间才能加载(大约3秒)。加载所花费的时间为空 我想知道,一旦加载了一些片段,是否有一种方法可以使用setOffscreenPageLimit(4),以便可以即时查看初始页面

我有一个相对复杂的布局,可以在viewpager中重用,有5页。viewpager位于父片段中

我的问题是,如果我不使用
setOffscreenPageLimit(4)
我的viewpager在浏览页面时会变得非常口吃,因为片段没有及时加载。缺点是,如果我使用
setOffscreenPageLimit(4)
,我的父片段需要很长时间才能加载(大约3秒)。加载所花费的时间为空

我想知道,一旦加载了一些片段,是否有一种方法可以使用
setOffscreenPageLimit(4)
,以便可以即时查看初始页面,而其他页面则加载在后台并保存在内存中

活动

public class MainActivity extends BaseActivity {

    public static int layout;
    public static ArrayList<ArrayList<Period>> bigList;
    private static final int TASKS = 0;
    private static final int TIMETABLE = 1;
    @BindView(R.id.navigation_view)
    NavigationView navigationView;
    @BindView(R.id.main_content)
    DrawerLayout drawerLayout;
    Runnable runnable;
    String themeName;
    int currentFragment;

    @Override
    @SuppressLint("InflateParams")
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        ViewGroup drawerContent = findViewById(R.id.drawer_content_container);
        drawerContent.addView(getLayoutInflater().inflate(R.layout.activity_main_content, null));
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

        TypedValue outValue = new TypedValue();
        getTheme().resolveAttribute(R.attr.themeName, outValue, true);
        themeName = (String) outValue.string;
        setUpNavigationView();

        layout = R.layout.fragment_timetable_page;
        String layoutString = this.getSharedPreferences("prefs", Context.MODE_PRIVATE).getString("layout", "flat");
        switch (layoutString) {
            case "card":
                layout = R.layout.fragment_timetable__page_cardview;
                break;
            case "flat":
                layout = R.layout.fragment_timetable_page;
        }

        bigList = new ArrayList<>();
        ArrayList<Period> periods = Util.getPeriods(this);

        ArrayList<Period> monPeriods = new ArrayList<>();
        ArrayList<Period> tuePeriods = new ArrayList<>();
        ArrayList<Period> wedPeriods = new ArrayList<>();
        ArrayList<Period> thuPeriods = new ArrayList<>();
        ArrayList<Period> friPeriods = new ArrayList<>();
        int[] mon = {0, 1, 2, 3, 4, 5};
        int[] tue = {6, 7, 8, 9, 10, 11};
        int[] wed = {12, 13, 14, 15, 16, 17};
        int[] thu = {18, 19, 20, 21, 22, 23};
        int[] fri = {24, 25, 26, 27, 28, 29};


        for (int count = 0; count < 6; count++) {
            if (periods != null && periods.size() == 30) {
                monPeriods.add(periods.get(mon[count]));
                tuePeriods.add(periods.get(tue[count]));
                wedPeriods.add(periods.get(wed[count]));
                thuPeriods.add(periods.get(thu[count]));
                friPeriods.add(periods.get(fri[count]));
            } else if (periods != null) {
                getSharedPreferences("periods", Context.MODE_PRIVATE).edit().clear().apply();
                startActivity(new Intent(this, MainActivity.class));
            }
        }
        bigList.add(monPeriods);
        bigList.add(tuePeriods);
        bigList.add(wedPeriods);
        bigList.add(thuPeriods);
        bigList.add(friPeriods);

        if (savedInstanceState == null) {
            switch (Util.getInstance(this).getLastFragment()) {
                case TIMETABLE:
                    setCurrentFragment(TIMETABLE, false);
                    break;
                case TASKS:
                    setCurrentFragment(TASKS, false);
                    break;
            }
        }
        ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, null, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                if (runnable != null) {
                    runnable.run();
                }
            }
        };
        drawerLayout.addDrawerListener(mDrawerToggle);
        updateNavigationDrawerHeader();
    }

    private void setUpNavigationView() {
        int accentColor = ThemeStore.accentColor(this);
        NavigationViewUtil.setItemIconColors(navigationView, ATHUtil.resolveColor(this, R.attr.icon_color, ThemeStore.textColorSecondary(this)), accentColor);
        NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor);
        navigationView.setCheckedItem(R.id.nav_timetable);
        navigationView.setNavigationItemSelectedListener(item -> {
            drawerLayout.closeDrawers();
            switchView(item.getItemId());
            return true;
        });
        for (int i = 0; i < navigationView.getChildCount(); i++) {
            navigationView.getChildAt(i).setOverScrollMode(View.OVER_SCROLL_NEVER);
        }
    }

    private void switchView(int id) {
        runnable = null;
        switch (id) {
            case R.id.nav_tasks:
                runnable = () -> setCurrentFragment(TASKS, true);
                break;
            case R.id.nav_timetable:
                runnable = () -> setCurrentFragment(TIMETABLE, true);
                break;
            case R.id.nav_settings:
                new Handler().postDelayed(() -> startActivity(new Intent(getBaseContext(), SettingsActivity.class)), 200);
                break;
            case R.id.nav_about:
                new Handler().postDelayed(() -> startActivity(new Intent(getBaseContext(), AboutActivity.class)), 200);
        }
    }

    private void updateNavigationDrawerHeader() {
        View navigationDrawerHeader = navigationView.getHeaderView(0);
        StatusBarView statusBarView = navigationDrawerHeader.findViewById(R.id.status_bar);
        TypedValue a = new TypedValue();
        getTheme().resolveAttribute(android.R.attr.windowBackground, a, true);
        int toolbarColor = ThemeStore.primaryColor(this);
        if (getSharedPreferences("prefs", MODE_PRIVATE).getBoolean("flat_ui", false)) {
            toolbarColor = a.data;
        }
        if (themeName.equals("light") && !ColorUtil.isColorLight(toolbarColor)){
            statusBarView.setBackgroundColor(Color.parseColor("#26000000"));
        }
        TextView title = navigationDrawerHeader.findViewById(R.id.title);
        title.setText(R.string.app_name);
        if (!themeName.equals("light")) {
            title.setTextColor(Color.WHITE);
        }
    }

    private void setCurrentFragment(int key, boolean navDrawer) {
        if ((key != currentFragment && navDrawer) || !navDrawer) {
            Util.getInstance(this).setLastFragment(key);
            Fragment fragmentToInflate;
            switch (key) {
                case TASKS:
                    navigationView.setCheckedItem(R.id.nav_tasks);
                    fragmentToInflate = TasksFragment.newInstance(navDrawer);
                    break;
                case TIMETABLE:
                    navigationView.setCheckedItem(R.id.nav_timetable);
                    if (Util.getPeriods(this) != null) {
                        fragmentToInflate = TimetableFragment.newInstance(navDrawer);
                    } else {
                        fragmentToInflate = TimetableNotCompletedFragment.newInstance(navDrawer);
                    }
                    break;
                default:
                    fragmentToInflate = TimetableFragment.newInstance(navDrawer);
            }
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToInflate, null).commit();
            currentFragment = key;
        }
    }

    @Override
    public void onBackPressed() {
        if (drawerLayout.isDrawerOpen(navigationView)) {
            drawerLayout.closeDrawer(navigationView);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            if (drawerLayout.isDrawerOpen(navigationView)) {
                drawerLayout.closeDrawer(navigationView);
            } else {
                drawerLayout.openDrawer(navigationView);
            }
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
子片段(第页)

公共类TimetableFragmentPage扩展片段实现View.OnClickListener{
私有视图[]期间=新视图[6];
私有文本视图[]标识=新文本视图[6];
私有文本视图[]主题=新文本视图[6];
私有文本视图[]详细信息=新文本视图[6];
私有IconImageView[]图标=新IconImageView[6];
私有图标按钮[]信息图标=新图标按钮[6];
星期一的私人国际会议;
公共时间表碎片页(){
}
静态TimetableFragmentPage newInstance(整数天,整数布局){
TimetableFragmentPage fragment=新的TimetableFragmentPage();
Bundle args=新Bundle();
args.putInt(“dayOfWeek”,day);
参数putInt(“布局”,布局);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、ViewGroup容器、Bundle savedInstanceState){
int layout=getArguments().getInt(“布局”);
视图=充气机。充气(布局、容器、假);
ButterKnife.bind(这个,视图);
setRetainInstance(真);
时段[0]=view.findViewById(R.id.P1);
句点[1]=view.findViewById(R.id.P2);
时段[2]=view.findViewById(R.id.P3);
时段[3]=view.findViewById(R.id.P4);
periods[4]=view.findviewbyd(R.id.P5);
时段[5]=view.findViewById(R.id.P6);
返回视图;
}
@凌驾
public void onStart(){
super.onStart();
setUpLayout();
}
专用布局(){
dayOfWeek=getArguments().getInt(“dayOfWeek”);
ArrayList periodData=MainActivity.bigList.get(dayOfWeek);
对于(int count=0;count<6;count++){
idents[count]=时段[count].findViewById(R.id.periodint);
受试者[count]=周期[count].findViewById(R.id.periodSub);
详细信息[count]=期间[count]。findViewById(R.id.periodDetails);
icons[count]=句点[count].findViewById(R.id.icon);
infoIcons[count]=句点[count].findViewById(R.id.periodInfo);
idents[count].setTextColor(ThemeStore.accentColor(getContext());
图标[count].setImageResource(periodData.get(count).getSubject(getContext()).GetSubjecticCon());
subjects[count].setText(periodData.get(count).getSubject(getContext()).getSubjectName());
教师=新教师(“教师姓氏”、“教师姓氏”、“教师头衔”,getContext());
房间=新房间(“房间前缀”,“房间”,getContext());
for(主题:Util.getSubjects(getContext())){
for(int index=0;index
我建议的第一件事是尽可能优化代码。从用户的角度来看,花3秒钟加载一个页面是非常糟糕的

但是,您可以使用
ViewTreeObserver.OnGlobalLayoutListener
来了解视图何时完成加载。我写了一个快速的例子,在我看到你实际上有一个片段托管你的ViewPager之前,但是这个概念仍然是一样的

基本上,这将在初始页面完全加载后设置屏幕外页面限制

//YourActivity
private ViewPager _viewPager;
public ViewPager getViewPager()
{
    return this._viewPager;
}

//First fragment
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
    @Override
    public void onGlobalLayout()
    {
        rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        ((YourActivity)_context).getViewPager().setOffscreenPageLimit(4);
    }
});
public class TimetableFragmentPage extends Fragment implements View.OnClickListener {

    private View[] periods = new View[6];
    private TextView[] idents = new TextView[6];
    private TextView[] subjects = new TextView[6];
    private TextView[] details = new TextView[6];
    private IconImageView[] icons = new IconImageView[6];
    private IconImageButton[] infoIcons = new IconImageButton[6];
    private int dayOfWeek;

    public TimetableFragmentPage() {
    }

    static TimetableFragmentPage newInstance(int day, int layout) {
        TimetableFragmentPage fragment = new TimetableFragmentPage();
        Bundle args = new Bundle();
        args.putInt("dayOfWeek", day);
        args.putInt("layout", layout);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        int layout = getArguments().getInt("layout");
        View view = inflater.inflate(layout, container, false);
        ButterKnife.bind(this, view);
        setRetainInstance(true);
        periods[0] = view.findViewById(R.id.P1);
        periods[1] = view.findViewById(R.id.P2);
        periods[2] = view.findViewById(R.id.P3);
        periods[3] = view.findViewById(R.id.P4);
        periods[4] = view.findViewById(R.id.P5);
        periods[5] = view.findViewById(R.id.P6);
        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        setUpLayout();
    }

    private void setUpLayout(){
        dayOfWeek = getArguments().getInt("dayOfWeek");
        ArrayList<Period> periodData = MainActivity.bigList.get(dayOfWeek);
        for (int count = 0; count < 6; count++) {
            idents[count] = periods[count].findViewById(R.id.periodIdent);
            subjects[count] = periods[count].findViewById(R.id.periodSub);
            details[count] = periods[count].findViewById(R.id.periodDetails);
            icons[count] = periods[count].findViewById(R.id.icon);
            infoIcons[count] = periods[count].findViewById(R.id.periodInfo);
            idents[count].setTextColor(ThemeStore.accentColor(getContext()));
            icons[count].setImageResource(periodData.get(count).getSubject(getContext()).getSubjectIcon());
            subjects[count].setText(periodData.get(count).getSubject(getContext()).getSubjectName());
            Teacher teacher = new Teacher("teacherFirstName", "teacherLastName", "teacherTitle", getContext());
            Room room = new Room("roomPrefix", "room", getContext());
            for (Subject subject : Util.getSubjects(getContext())) {
                for (int index = 0; index < subject.getTeachers().size(); index++) {
                    if (subject.getTeachers().get(index).getTeacherKey() == periodData.get(count).getTeacherKey()) {
                        teacher = subject.getTeachers().get(index);
                        break;
                    }
                }
                for (int index = 0; index < subject.getRooms().size(); index++) {
                    if (subject.getRooms().get(index).getRoomKey() == periodData.get(count).getRoomKey()) {
                        room = subject.getRooms().get(index);
                        break;
                    }
                }
            }
            details[count].setText(room.getRoomPrefix() + room.getRoom() + ", " + teacher.getTeacherTitle() + " " + teacher.getTeacherLastName());

            if (infoIcons[0] != null) {
                idents[count].setText(getResources().getStringArray(R.array.periods)[count]);
                infoIcons[count].setOnClickListener(this);
            } else {
                idents[count].setText(String.valueOf(count + 1));
                periods[count].setOnClickListener(this);
            }
        }
    }

    @Override
    public void onClick(View v) {
        Intent view = new Intent(getContext(), SubjectViewActivity.class);
        int[] basePeriod = {
                0,
                6,
                12,
                18,
                24
        };
        int period = 0;

        for (int count = 0; count < 6; count++) {
            if (v == infoIcons[count] || v == periods[count]) {
                period = count;
            }
        }

        view.putExtra("period", basePeriod[dayOfWeek] + period);
        startActivity(view);
    }
}
//YourActivity
private ViewPager _viewPager;
public ViewPager getViewPager()
{
    return this._viewPager;
}

//First fragment
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
    @Override
    public void onGlobalLayout()
    {
        rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        ((YourActivity)_context).getViewPager().setOffscreenPageLimit(4);
    }
});