java viewpager 完成后调用活动
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15941111/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Call activity after viewpager is finished
提问by Anupam
I'm developing an application in which I have to use viewpager and after all items in viewpager is finished I have to call an activity. I'm not able to get event listener for this. Here is what I have been refering too: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.java
我正在开发一个应用程序,我必须在其中使用 viewpager,在完成 viewpager 中的所有项目后,我必须调用一个活动。我无法为此获得事件侦听器。这也是我一直在引用的内容:https: //github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.java
Here is what I have done so far:
这是我到目前为止所做的:
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);
}
}
}
My question is how to get event listener if all the items in viewpager is finished.
我的问题是如果 viewpager 中的所有项目都完成了如何获取事件侦听器。
回答by Triode
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
or onPageSelected
any of these you can use here and also check the selected page is equals to the number of items in the ViewPager
.
onPageScrolled
或者onPageSelected
您可以在此处使用其中任何一个,并检查所选页面是否等于ViewPager
.
回答by cn123h
these three callbacks work like this:
这三个回调是这样工作的:
- onPageScrollStateChanged is called with state ViewPager.SCROLL_STATE_DRAGGING
- onPageScrolled will be called many times, its parameter positionOffset and positionOffsetPixels are keep increasing
- onPageScrolled's parameter positionOffset more than 0.5, onPageScrollStateChanged is called with state SCROLL_STATE_SETTLING
- onPageSelected is called with next page index as position
- onPageScrolled will be called many times, its parameter positionOffset and positionOffsetPixels are keep increasing
- onPageScrolled's parameter positionOffset is 1, onPageScrollStateChanged is called with state SCROLL_STATE_IDLE
- onPageScrollStateChanged 使用状态 ViewPager.SCROLL_STATE_DRAGGING 调用
- onPageScrolled 会被多次调用,其参数 positionOffset 和 positionOffsetPixels 不断增加
- onPageScrolled 的参数 positionOffset 大于 0.5,onPageScrollStateChanged 被调用,状态为 SCROLL_STATE_SETTLING
- onPageSelected 以下一页索引作为位置被调用
- onPageScrolled 会被多次调用,其参数 positionOffset 和 positionOffsetPixels 不断增加
- onPageScrolled 的参数 positionOffset 为 1,调用 onPageScrollStateChanged 状态为 SCROLL_STATE_IDLE
The logic should not put in onPageSelected and onPageScrollStateChanged, because with them you only know state is changed. only in onPageScrolled you can get the direction. So my implementation is like this:
逻辑不应该放在 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;
}
}
回答by SajithK
Suggested answers are complex than I thought.So I created a simple one.
建议的答案比我想象的要复杂。所以我创建了一个简单的答案。
I used OnPageChangeListener in ViewPager class. Here we have 3 methods. void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) void onPageSelected(int position); void onPageScrollStateChanged(int state);
我在 ViewPager 类中使用了 OnPageChangeListener。这里我们有3种方法。void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) void onPageSelected(int position); void onPageScrollStateChanged(int state);
It is important to know what are the states in onPageScrollStateChanged() and their sequence of execution.There are 3 states as SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING and SCROLL_STATE_SETTLING.
了解 onPageScrollStateChanged() 中的状态及其执行顺序很重要。有 3 种状态,即 SCROLL_STATE_IDLE、SCROLL_STATE_DRAGGING 和 SCROLL_STATE_SETTLING。
Here is the execution order. Scroll_state_dragging --> Scroll_state_settling --> onPageSelected() --> Scroll_state_idle
这是执行顺序。Scroll_state_dragging --> Scroll_state_settling --> onPageSelected() --> Scroll_state_idle
The idea is keeping a flag inside onPageSelected() to record current page number. Then if user in the last page and swipe left scroll_state_dragging called and launch the next view.
这个想法是在 onPageSelected() 中保留一个标志来记录当前页码。然后,如果用户在最后一页并向左滑动 scroll_state_dragging 调用并启动下一个视图。
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();
}
I have created a complete example here.
回答by Gokhan Arik
Thanks Triode for great answer.
感谢三极管的精彩回答。
I used the code you posted for my project. In my case, I am finishing the activity if a user swipes to the right on last fragment. It worked fine, but it was still finishing the activity when you swipe to left instead of swiping right.
我使用了您为我的项目发布的代码。就我而言,如果用户在最后一个片段上向右滑动,我将完成活动。它运行良好,但是当您向左滑动而不是向右滑动时,它仍在完成活动。
I made a change in your code and put adapter.getCount() - 1
in place of selectedIndex
. In this case it will not finish the activity if user swipes to left.
我对您的代码进行了更改并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;
}
回答by king_mozotto
@Override
public void onPageScrolled(int pageScrolledOn, float positionOffset, int positionOffsetPixels) {
if(positionOffset == 0F){
// meaning you cannot scroll further in current scroll direction
int lastPage = viewPagerAdapter.getCount - 1;
if (pageScrolledOn == lastPage){
//scroll on last page has occured
scrolledOnLastPage = true;
}
}
}
回答by Athanasios Moutsioulis
When you are at the last page and you slide to finish the activity the state SCROLL_STATE_SETTLING is skipped and the pager goes directly to SCROLL_STATE_IDLE
当您在最后一页并且您滑动以完成活动时,状态 SCROLL_STATE_SETTLING 被跳过并且寻呼机直接进入 SCROLL_STATE_IDLE
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) {
}
}