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

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

公瑞
2023-03-14

我在我的应用程序中实现了一个由两张幻灯片组成的ViewPager。我可以从第一张幻灯片第二张幻灯片,然后倒转。但是我这里有一个特例。如果用户从第一张幻灯片转到第二张幻灯片。他不应该能够返回到第一张幻灯片。我需要禁用回到First 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个答案

葛高澹
2023-03-14
/**
 * 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,并在您的onPage选择()位置回调检查中使用。如果它是最后一个位置,则调用view Pager实例上的setShouldScroll(false)方法,这将使我们的ScrollableViewPager类中的应该滚动为false,并最终使滚动无效,因为我们已经重写了onTouchEvent()和onInterceptTouchEvent()方法,该方法检查应该滚动的值。

 类似资料:
  • 我想拿一张PowerPoint幻灯片(“源”),并将其插入到另一张已经包含一些内容的PowerPoint幻灯片(“目标”)中,位于源PowerPoint幻灯片中的特定位置。 我已经尝试了几种方法来研究这样做的代码,但是我不断得到将幻灯片合并到PowerPoint演示文稿中的结果,这不是我想要的。我想拿一张现有的幻灯片并将其插入到另一张幻灯片中,就像在现有幻灯片中插入图片一样。 我有另一位同事编写的

  • 我正在尝试自动化电子邮件注册。当我手动操作时,它会工作,但当我用selenium打开网站时,它不会工作。它有我不能做的验证。有没有一种方法可以在不被检测的情况下打开(而不是控制,我使用pyautogui)一个网站? 我的代码:

  • 问题链接1链接2链接3 从上面的链接,我希望我遵循的答案是被接受的。但我还是有例外。我正在使用Java 6。 代码: 堆栈跟踪:

  • 问题内容: 我刚刚开始学习Angular.js,并且在Angular-ui中使用Carousel控件。是否可以同时显示两个幻灯片而不是一个? 我想显示这些图像- 这是一个示例- http://plnkr.co/edit/BnErmMDl8nPvXPrw3ULu?p=preview 问题答案: 您可以将图像分组在一起,也可以将其分组。除了一些所需的样式修复之外,以下是方法: http://plnkr

  • 我已经尝试了一段时间,但我不能旋转片段视图,这是在一个视页。单击是在ViewPager的父片段的视图上。我一直得到空指针异常。我已经在我得到异常的代码行上面注释了。 主片段

  • 我的logcat显示: 任何帮助都将不胜感激!谢谢!