Armando Alberti
Armando Alberti

Reputation: 103

slider a pager from onBackPressed

I need to change the slides of my pager programmatically when backbutton is pressed in the wrapper activity, but when I call pager.setCurrentItem(1) inside the onBackPressed the application is being closed.

Code:

public class MainActivity extends FragmentActivity {

static final int NUM_ITEMS = 3;
static int fSelected = 1;

MyAdapter mAdapter;
ViewPager mPager;

// ADAPTER
public static class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return FirstFragment.init(position);
            case 1:
                return SecondFragment.init(position);
            case 2:
                return ThirdFragment.init(position);
            default:
                return null;
        }
    }

}


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Context mContext = getApplicationContext();
    playAppearAnimation(mContext);

    // ANIM
    playAppearAnimation(getApplicationContext());



    final ViewPager mPager = findViewById(R.id.pager);
    mAdapter = new MyAdapter(getSupportFragmentManager());
    mPager.setAdapter(mAdapter);

    mPager.setCurrentItem(1);


    //disabilita lo scroll by touch0
    mPager.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            return false;
        }
    });



    // BACK TO RETRIEVE PASSWORD
    TextView button = (TextView)findViewById(R.id.lost_password);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mPager.setCurrentItem(0);
        }
    });
    /*
    button = (Button)findViewById(R.id.goto_last);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {+

            mPager.setCurrentItem(NUM_ITEMS-1);
        }
    });*/



    // ANIMAZIONE DEL RECUPERA PASSWORD
    mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        public void onPageScrollStateChanged(int state) {}
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        public void onPageSelected(int position) {
            // NASCONDO LOST PASSWORD
            View lostPassword = (TextView)findViewById(R.id.lost_password);
            //Toast.makeText(getApplicationContext(),""+position, Toast.LENGTH_LONG).show();
            //>> HIDE / UNHIDE lost password
            switch(position){
                case 0:
                    fSelected = 0;
                    lostPassword.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_out));
                    break;
                case 1:
                    fSelected = 1;
                    lostPassword.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_in));
                    break;
                case 2:
                    fSelected = 2;
                    lostPassword.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_out));
                    break;
            }
        }
    });


}

public void playAppearAnimation(Context context){
    ImageView logo = findViewById(R.id.logo);
    ImageView logotype = findViewById(R.id.logotype);
    logo.startAnimation(AnimationUtils.loadAnimation(context, R.anim.logo_anim));
    logotype.startAnimation(AnimationUtils.loadAnimation(context, R.anim.logo_anim));

    com.ubris.design.test1.NonSwipeableViewPager pager = findViewById(R.id.pager);
    pager.startAnimation(AnimationUtils.loadAnimation(context, R.anim.anim_fragments));
}


@Override
public void onBackPressed() {

    mPager.setCurrentItem(0);
}

Logcat:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.view.ViewPager.setCurrentItem(int)' on a null object reference at com.ubris.design.test1.MainActivity.onBackPressed(MainActivity.java:155) at android.app.Activity.onKeyUp(Activity.java:2826) at android.view.KeyEvent.dispatch(KeyEvent.java:2766) at android.app.Activity.dispatchKeyEvent(Activity.java:3146) at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:353) at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4742) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4713) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4249) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4302) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4268) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4395) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4276) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4452) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4249) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4302) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4268) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4276) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4249) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4302) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4268) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4428) at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4589) at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2512) at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2106) at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2097) at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2487) at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:356) at android.os.Looper.loop(Looper.java:138) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)italic

Upvotes: 0

Views: 63

Answers (1)

Anton Malyshev
Anton Malyshev

Reputation: 8861

Remove super.onBackPressed() from the code - that's what usually closes the app in such case.

UPD.: as you posted the code, the problem is clear now. Change final ViewPager mPager = findViewById(R.id.pager); to mPager = findViewById(R.id.pager); to assign its value instead of creating local variable.

Upvotes: 2

Related Questions