Reputation: 103
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
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