The problem is with mFirstCrimeButton,mLastCrimeButton being returned as null.
The activity is CrimePagerActvity and the fragment upon it is an instance of CrimeFragment (in which the main part of layout is defined)
i need logic from the viewpager's getCurrentItem() for the buttons.
The activity Code
public class CrimePagerActivity extends AppCompatActivity {
private static final String EXTRA_CRIME_ID = "com.example.criminalintent.crime_id";
private ViewPager mViewPager;
private List<Crime> mCrimes;
private CrimeLab mCrimeLab;
private Button mFirstCrimeButton;
private Button mLastCrimeButton;
public static Intent newIntent(Context context, UUID crimeId){
Intent intent = new Intent(context,CrimePagerActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crimeId);
return intent;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);
UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);
mViewPager = (ViewPager)findViewById(R.id.crime_view_pager);
mFirstCrimeButton = (Button)findViewById(R.id.first_crime_button);
mLastCrimeButton = (Button)findViewById(R.id.last_crime_button);
if(mFirstCrimeButton==null){
Log.d("CrimepagerActivity","Button is null");
}
mCrimeLab = CrimeLab.get(this);
mCrimes = mCrimeLab.getCrimes();
FragmentManager fragmentManager = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
@NonNull
@Override
public Fragment getItem(int position) {
Crime crime = mCrimes.get(position);
return CrimeFragment.newInstance(crime.getId());
}
@Override
public int getCount() {
return mCrimes.size();
}
});
mViewPager.setCurrentItem(mCrimes.indexOf(mCrimeLab.getCrime(crimeId)));
if(mViewPager.getCurrentItem()==0){mFirstCrimeButton.setEnabled(false);}
if(mViewPager.getCurrentItem()==(mCrimes.size()-1)){mLastCrimeButton.setEnabled(false);}
mFirstCrimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(0);
}
});
mLastCrimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(mCrimes.size()-1);
}
});
}
}
The logs
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.criminalintent/com.example.criminalintent.CrimePagerActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.criminalintent.CrimePagerActivity.onCreate(CrimePagerActivity.java:73)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)