如何避免在Android中的Viewpager中转到上一张幻灯片

时间:2017-10-11 14:48:03

标签: android android-layout android-viewpager

我在我的应用程序中实现了一个ViewPager,其中包含两张幻灯片。我可以从first slide转到second slide并反转。但我在这里有一个特例。如果用户从First Slide转到Second Slide。他不应该回到First slide。我需要在进入First Slide后禁用返回Second Slide

这是我的代码:

public class BotConnectionDialog extends DialogFragment {

    private RelativeLayout toolbar;
    private ImageView toolbarCloseButton;
    private View layoutView;
    private ViewPager viewPager;
    private BotConnectionDialogAdapter myViewPagerAdapter;
    private LinearLayout dotsLayout;
    private TextView[] dots;
    int width, height;
    DisplayMetrics metrics;
    private int[] layouts;
    private final String TAG = BotConnectionDialog.class.getSimpleName();
    private Button btnSkip, btnNext;

    View.OnClickListener myListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Handler handler = new Handler();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    getActivity().getSupportFragmentManager().popBackStackImmediate();
                }
            });
        }
    };

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.botconnection_layout, container, false);
        Typeface typeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/corbert.otf");
        toolbar = (RelativeLayout) rootView.findViewById(R.id.customAppBarLayout);
        toolbar.setBackgroundColor(Color.parseColor("#00000000"));
        toolbarCloseButton = (ImageView) rootView.findViewById(R.id.toolbarCloseButton);
        toolbarCloseButton.setOnClickListener(myListener);
        viewPager = (ViewPager) rootView.findViewById(R.id.view_pager);
        dotsLayout = (LinearLayout) rootView.findViewById(R.id.layoutDots);
        btnSkip = (Button) rootView.findViewById(R.id.btn_skip);
        btnSkip.setTypeface(typeface);
        btnNext = (Button) rootView.findViewById(R.id.btn_next);
        btnNext.setTypeface(typeface);
        metrics = getResources().getDisplayMetrics();
        width = metrics.widthPixels;
        height = metrics.heightPixels;

        // layouts of all welcome sliders
        // add few more layouts if you want
        layouts = new int[]{
                R.layout.slide1,
                R.layout.slide2};

        // adding bottom dots
        addBottomDots(0);

        myViewPagerAdapter = new BotConnectionDialogAdapter();
        viewPager.setAdapter(myViewPagerAdapter);
        viewPager.addOnPageChangeListener(viewPagerPageChangeListener);

        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // checking for last page
                // if last page home screen will be launched
                int current = getItem(+1);
                if (current < layouts.length) {
                    // move to next screen
                    viewPager.setCurrentItem(current);
                } else {

                }
            }
        });
        return rootView;
    }

    private void addBottomDots(int currentPage) {
        dots = new TextView[layouts.length];

        int[] colorsActive = getResources().getIntArray(R.array.array_dot_active);
        int[] colorsInactive = getResources().getIntArray(R.array.array_dot_inactive);

        dotsLayout.removeAllViews();
        for (int i = 0; i < dots.length; i++) {
            dots[i] = new TextView(getActivity());
            dots[i].setText(Html.fromHtml("&#8226;"));
            dots[i].setTextSize(35);
            dots[i].setTextColor(colorsInactive[currentPage]);
            dotsLayout.addView(dots[i]);
        }

        if (dots.length > 0)
            dots[currentPage].setTextColor(colorsActive[currentPage]);
    }

    private int getItem(int i) {
        return viewPager.getCurrentItem() + i;
    }


    //  viewpager change listener
    ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            addBottomDots(position);

            // changing the next button text 'NEXT' / 'GOT IT'
            if (position == layouts.length - 1) {
                // last page. make button text to GOT IT
                btnNext.setText(getString(R.string.start));
                btnSkip.setVisibility(View.GONE);
                /**
                 * bluetooth connection the bot
                 */
                Toast.makeText(getActivity(), "Finished", Toast.LENGTH_SHORT).show();
            } else {
                // still pages are left
                btnNext.setText(getString(R.string.next));
                btnSkip.setVisibility(View.VISIBLE);
                /**
                 * First page
                 */
                Toast.makeText(getActivity(), "2nd page", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }
    };


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        //dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }

    @Override
    public void onResume() {
        super.onResume();
//        getDialog().getWindow().setLayout((7 * width) / 7, (4 * height) / 5);
    }

    public class BotConnectionDialogAdapter extends PagerAdapter {
        /**
         * View pager adapter
         */
        private LayoutInflater layoutInflater;

        public BotConnectionDialogAdapter() {
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = layoutInflater.inflate(layouts[position], container, false);
            container.addView(view);
            return view;
        }

        @Override
        public int getCount() {
            return layouts.length;
        }

        @Override
        public boolean isViewFromObject(View view, Object obj) {
            return view == obj;
        }


        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            View view = (View) object;
            container.removeView(view);
        }

    }

}

1 个答案:

答案 0 :(得分:1)

/**
 * To disable and enable scrolling on ViewPager, just set shouldScroll to true or false.
 */

public class ScrollableViewPager extends ViewPager {

    private boolean shouldScroll = true;

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

    public void setShouldScroll(boolean shouldScroll) {
        this.shouldScroll = shouldScroll;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return shouldScroll && super.onTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return shouldScroll && super.onInterceptTouchEvent(ev);
    }
}

现在使用此 ScrollableViewPager 代替默认的 ViewPager 并在onPageSelected()回调中使用 检查位置。如果它是最后一个位置,请在viewPager实例上调用 setShouldScroll(false)方法,这将使我们的ScrollableViewPager类中的 shouldScroll 为false,并最终使滚动无效为我们已覆盖 onTouchEvent() onInterceptTouchEvent()方法,该方法会检查 shouldScroll 的值。