Ferial Adrian
Ferial Adrian

Reputation: 83

Android ViewPager on a Null Object Reference

I have an activity that require a viewPager that includes 2 fragments on it, but when I setting up ViewPager adapter in onCreateView, its always null. I use ButterKnife for bind its layout to activity.

The error was when this code executed

viewPager.setAdapter(vp_adapter);

Error in Logcat

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference

MainActivity.java

@BindView(R.id.tab_layout)
TabLayout tabLayout;

@BindView(R.id.view_pager)
ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    handleViewPager();
    handlePosition();
}


private void handleViewPager(){
    ViewPagerAdapter vp_adapter = new ViewPagerAdapter(getSupportFragmentManager(), getApplicationContext());
    viewPager.setAdapter(vp_adapter);
    viewPager.setOffscreenPageLimit(2);
    tabLayout.setupWithViewPager(viewPager);
}

activity_main.xml

<LinearLayout
    android:id="@+id/topUpHeader"
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:background="#1e84d4">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Top Up"
        android:textColor="#ffffff"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"/>


</LinearLayout>

<LinearLayout
    android:id="@+id/viewpager_parent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_below="@id/topUpHeader">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabGravity="fill"
        app:tabMode="fixed"
        app:tabIndicatorColor="#000000">
    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/viewpager_parent">

    </android.support.v4.view.ViewPager>

</LinearLayout>

How do it can be done ?

edited: so its just run with onCreateView like this

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    setContentView(R.layout.activity_main);

    viewPager   = findViewById(R.id.view_pager);
    tabLayout   = findViewById(R.id.tab_layout);
    ViewPagerAdapter vp_adapter = new ViewPagerAdapter(getSupportFragmentManager(), this);
    viewPager.setAdapter(vp_adapter);
    viewPager.setOffscreenPageLimit(2);
    tabLayout.setupWithViewPager(viewPager);

    handlePosition();
}

Upvotes: 0

Views: 831

Answers (2)

DHAVAL A.
DHAVAL A.

Reputation: 2321

You have forgot to find view. I see that you are using ButterKnife view binding.

So first declare global variable viewPager using below code.

@BindView(R.id. view_pager) 
ViewPager viewPager;

Butterknife SDK in gradle.

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

Upvotes: 1

Rachit Seksaria
Rachit Seksaria

Reputation: 56

You are using Butterknife the wrong way. You need to define every view in your xml which you want to use in your java file. Define viewPager as @BindView(R.id.view_pager) ViewPager viewPager;. Same goes for tabLayout. Consider using data binding if you want to use viewPager directly.

Upvotes: 0

Related Questions