Method tabLayout.setupWithViewPager(viewPager) causes app crashes

Viewed 167

Recently I changed from andoroid to androidx. After that, my app crash after successfully sign in. The following quotes are the errors:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.tabs.TabLayout.setupWithViewPager(androidx.viewpager.widget.ViewPager)' on a null object reference

After a lot of research, some suggest that use finishUpdate method but my app still crashes.

@Override public void finishUpdate(ViewGroup container) {
try{ 
   super.finishUpdate(container);
}
catch (NullPointerException nullPointerException){
    System.out.println("Catch the NullPointerException in MainActivityFragmentsAdapter.finishUpdate");
    } 
}

I also have tried to replace code tabLayout.setupWithViewPager(viewPager); to codes below but same error

viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    //tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });

The codes below are my MainActivity class

public class MainActivity extends BaseActivity {

MainActivityFragmentsAdapter mainActivityFragmentsAdapter;
ViewPager viewPager;
String SAVE_INSTANCE_STATE_KEY = "MainActivityFragmentConfig";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 
    mainActivityFragmentsAdapter = new MainActivityFragmentsAdapter(getSupportFragmentManager());
    viewPager = findViewById(R.id.main_view_pager);
    viewPager.setAdapter(mainActivityFragmentsAdapter);
    if(savedInstanceState != null ) {
        position = savedInstanceState.getInt(SAVE_INSTANCE_STATE_KEY);
        viewPager.setCurrentItem(position);
    }
    final TabLayout tabLayout = findViewById(R.id.main_tab_layout);
    tabLayout.setupWithViewPager(viewPager); // This is the ERROR LINE
    viewPager.setOffscreenPageLimit(4);
    setTabIcons(tabLayout);
    ActivityCompat.requestPermissions(MainActivity.this, new String[]
            {android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onRestoreInstanceState(savedInstanceState, persistentState);
        if(savedInstanceState != null ) {
            int position = savedInstanceState.getInt(SAVE_INSTANCE_STATE_KEY);
            viewPager.setCurrentItem(position);
        }
}

    @Override
    public void onStart() {
        super.onStart();
    }

int position;
@Override
protected void onPause() {
    super.onPause();
    position = viewPager.getCurrentItem();
}

@Override
protected void onResume() {
    super.onResume();
    viewPager.setCurrentItem(position);
}

public void setTabIcons(TabLayout tabLayout) {
    int icons[]= {
            R.drawable.ic_calendar,
            R.drawable.ic_task_complete,
            R.drawable.ic_alarm_clock,
            R.drawable.ic_man_user
    };
    for(int i = 0; i < icons.length; i++) {
      tabLayout.getTabAt(i).setIcon(icons[i]);
    }
}
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.d("MAIN ACTIVITY", "Saving instance state");
    outState.putInt(SAVE_INSTANCE_STATE_KEY, viewPager.getCurrentItem());
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.fyp.selfzenapp.MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/main_view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="60dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <include
        android:id="@+id/main_tab_layout_include"
        layout="@layout/main_tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
0 Answers
Related