Java 完成viewpager后调用活动

Java 完成viewpager后调用活动,java,android,android-layout,android-viewpager,swipe,Java,Android,Android Layout,Android Viewpager,Swipe,我正在开发一个应用程序,其中我必须使用viewpager,在viewpager中的所有项目完成后,我必须调用一个活动。我无法为此获取事件侦听器。以下是我一直提到的: 以下是我迄今为止所做的工作: public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); se

我正在开发一个应用程序,其中我必须使用viewpager,在viewpager中的所有项目完成后,我必须调用一个活动。我无法为此获取事件侦听器。以下是我一直提到的:

以下是我迄今为止所做的工作:

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
    ImagePagerAdapter adapter = new ImagePagerAdapter();
    viewPager.setAdapter(adapter);

    OnPageChangeListener mListener = new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            // TODO Auto-generated method stub

        }

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

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            Log.i("Doing something here", "On Scroll state changed");
        }
    };
    viewPager.setOnPageChangeListener(mListener);

}

private class ImagePagerAdapter extends PagerAdapter {
    private int[] mImages = new int[] { R.drawable.libin1,
            R.drawable.libin2 };

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

    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Context context = MainActivity.this;
        ImageView imageView = new ImageView(context);
        int padding = context.getResources().getDimensionPixelSize(
                R.dimen.padding_medium);
        imageView.setPadding(padding, padding, padding, padding);
        imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        imageView.setImageResource(mImages[position]);
        ((ViewPager) container).addView(imageView, 0);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((ImageView) object);
    }
}
}
我的问题是,如果viewpager中的所有项目都已完成,如何获取事件侦听器

private OnPageChangeListener mListener = new OnPageChangeListener() {

    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub
        selectedIndex = arg0;

    }
    boolean callHappened;
    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
        if( mPageEnd && arg0 == selectedIndex && !callHappened)
        {
            Log.d(getClass().getName(), "Okay");
            mPageEnd = false;//To avoid multiple calls. 
            callHappened = true;
        }else
        {
            mPageEnd = false;
        }
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
        if(selectedIndex == adapter.getCount() - 1)
        {
            mPageEnd = true;
        }
    }
};
ViewPager.setOnPageChangeListener(mListener);

onPageScrolled
onPageSelected
您可以在此处使用其中任何一个,并检查所选页面是否等于
查看页面中的项目数

谢谢三极管的精彩回答

我使用了你为我的项目发布的代码。在我的例子中,如果用户在最后一个片段上向右滑动,我将完成活动。它工作得很好,但当你向左滑动而不是向右滑动时,它仍在完成活动

我对您的代码进行了更改,并将
adapter.getCount()-1
替换为
selectedIndex
。在这种情况下,如果用户向左滑动,它将不会完成活动

if( mPageEnd && arg0 == adapter.getCount()-1 && !callHappened){
    Log.d(getClass().getName(), "Okay");
    mPageEnd = false;//To avoid multiple calls. 
    callHappened = true;
}else{
    mPageEnd = false;
}

这三个回调的工作方式如下:

        private int selectedPageIndex = -1;
        private boolean exitWhenScrollNextPage = false;

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if (exitWhenScrollNextPage && position == PAGE_COUNT - 1) {
                exitWhenScrollNextPage = false; // avoid call more times
                AndroidLog.error("-------- YEAH!");
            }
        }

        @Override
        public void onPageSelected(int position) {
            selectedPageIndex = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == SCROLL_STATE_IDLE) {
                exitWhenScrollNextPage = selectedPageIndex == PAGE_COUNT - 1;
            }

        }
  • onPageScrollStateChanged是通过状态ViewPager.SCROLL\u state\u拖动调用的
  • onPageScrolled将被多次调用,其参数positionOffset和positionOffsetPixels不断增加
  • onPageScrolled的参数positionOffset大于0.5,调用onPageScrollStateChanged时使用状态滚动\状态\设置
  • 调用onPageSelected时,将下一页索引作为位置
  • onPageScrolled将被多次调用,其参数positionOffset和positionOffsetPixels不断增加
  • onPageScrolled的参数positionOffset为1,调用onPageScrollStateChanged时使用状态SCROLL\u state\u IDLE
逻辑不应该放在onPageSelected和onPageScrollStateChanged中,因为有了它们,您只知道状态发生了变化。只有在onPageScrolled中才能获得方向。所以我的实现是这样的:

        private int selectedPageIndex = -1;
        private boolean exitWhenScrollNextPage = false;

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if (exitWhenScrollNextPage && position == PAGE_COUNT - 1) {
                exitWhenScrollNextPage = false; // avoid call more times
                AndroidLog.error("-------- YEAH!");
            }
        }

        @Override
        public void onPageSelected(int position) {
            selectedPageIndex = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == SCROLL_STATE_IDLE) {
                exitWhenScrollNextPage = selectedPageIndex == PAGE_COUNT - 1;
            }

        }

建议的答案比我想象的要复杂,所以我创造了一个简单的答案

我在ViewPager类中使用了OnPageChangeListener。这里我们有3种方法。 void onPageScrolled(int-position、float-positionOffset、int-positionOffsetPixels) 已选择页面无效(内部位置); 无效onPageScrollStateChanged(int状态)

了解onPageScrollStateChanged()中的状态及其执行顺序很重要。有3种状态,即SCROLL\u STATE\u IDLE、SCROLL\u STATE\u Draging和SCROLL\u STATE\u Setting

这是执行令。 滚动\u状态\u拖动-->滚动\u状态\u设置-->打开选定页()-->滚动\u状态\u空闲

其想法是在onPageSelected()中保留一个标志,以记录当前页码。然后,如果用户在最后一页中滑动左滚动\ U状态\ U拖动调用并启动下一个视图

private int pagePosition; // keep a class variable
private int[] layouts= new int[]{
    R.layout.welcome_slide1,
    R.layout.welcome_slide2,
    R.layout.welcome_slide3}; 

ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override    
public void onPageSelected(int position) {
    addBottomDots(position);
    pagePosition = position;
}

@Override 
public void onPageScrolled(int position, float positionOffset, int arg2) {
}

@Override  
public void onPageScrollStateChanged(int state) {
    if (state == ViewPager.SCROLL_STATE_DRAGGING) {
        if (pagePosition == layouts.length - 1) {
            launchHomeScreen();
        }
    }
}
};

private void launchHomeScreen() {
startActivity(new Intent(IntroductionActivity.this, MainDockerActivity.class));
finish();
}

我已经创建了一个完整的示例

当您在最后一页上滑动以完成活动时,状态滚动\u状态\u结算被跳过,寻呼机直接转到滚动\u状态\u空闲

private val viewPagerPageChangeListener = object  : ViewPager.OnPageChangeListener{

    var blnPageTriesToSettle = false

    override fun onPageScrollStateChanged(state: Int) {
        when(state){
            SCROLL_STATE_IDLE ->{
                if (!blnPageTriesToSettle){

                    println("You are at the last page and you slide to finish")
                    finish()

                }
            }
            SCROLL_STATE_DRAGGING ->{  blnPageTriesToSettle = false }
            SCROLL_STATE_SETTLING ->{  blnPageTriesToSettle = true }
        }
    }

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
    }

    override fun onPageSelected(position: Int) {
    }
}

完成了!!!你能解释一下吗?我想我已经解释了问题的全部内容。没有什么可以解释的。你怀疑什么?我清楚地提出了这样一个疑问:如果用户已滚动到viewpager中的最后一个项目,“如果用户已滚动到viewpager中的最后一个项目”,那么如何获取事件侦听器,或者是否有其他方法调用某个活动。在我的代码中添加这一点更有意义。在
onPageScrollStateChanged
上打印日志,它在用户制作的每个scroll上打印。如何计算我的数组。所以,在数组索引到达其末尾之后,只有fire事件。我已经用更新的代码编辑了我的问题。请查看并建议我应该做什么?onPageScrolled在该函数内只需检查ViewPager的选定索引是否与数组大小相同,然后激发thr事件+1以获得答案。还有一件事,每当我滑动到第二个视图时,我的意图被调用。当用户再次在屏幕上滑动时,我可以调用intent吗?现在,只要我的数组索引到达末尾,就会调用intent。嘿,我已经编辑了你上面写的代码,我陷入了错误。每当我将第二页刷到第二页时,
Log.d(getClass().getName(),“OK”)已打印。我只需要一次打印。请你也看看我关于这个的下一个问题。这里是链接。您可以设置一个布尔值来表示函数已被调用。并在执行调用之前检查布尔值。如何获取Page_count
Page_count
很可能是在类顶部定义的常量。您可以改为使用项数。@pranethkumar来自视图页面的适配器,如adapter.getCount();