Null pointer Exception - findViewById()

59,501

Solution 1

findViewById() returns a View if it exists in the layout you provided in setContentView(), otherwise it returns null and that's what happening to you. Note that if you don't setContentView(), and don't have a valid view to findViewById() on, findViewById() will always return null until you call setContentView().

This also means variables in the top-level trigger an NPE, because they're called before onCreate(), and by extension, before setContentView(). See also the activity lifecycle

Example if you setContentView(R.layout.activity_first); and then call findViewById(R.id.first_View); it will return a View which is your layout.

But if you call findViewById(R.id.second_View); before setContentView(), it will return null since there is not a view in your activity_first.xml layout called @+id/second_View.

Solution 2

Emphasis added

For those cases within an Activity class.

Activity.findViewById(int id)

Finds a view that was identified by the id attribute from the XML that was processed in onCreate(Bundle).


Otherwise, such as an Fragment, Adapter, a View from a LayoutInflater, etc.

View.findViewById(int id)

Look for a child view with the given id. If this view has the given id, return this view.


Either case,

Returns
The view if found or null otherwise.


Now, re-check your XML files. Make sure you put the right value into setContentView or inflater.inflate.

In the case of an Activity, call findViewById after setContentView.

Then, make sure there is a View you are looking for with android:id="@+id/..." in that layout. Make sure the + is at @+id, which will add the resource to the R.id values to ensure you can find it from Java.

Solution 3

Sometimes you need clean your project in Eclipse (Project - Clean..).

Solution 4

The views you're trying to get are not defined in your activity_main layout. You need to programmatically inflate the views you're trying to add to the pager.-

@Override
public Object instantiateItem(ViewGroup collection, int position) {
    LinearLayout l = null;

    if (position == 0) {
        l = (LinearLayout) View.inflate(this, R.layout.activity_first, null);
    }
    if (position == 1) {
        l = (LinearLayout) View.inflate(this, R.layout.activity_second, null);
    }
    if (position == 2) {
        l = (LinearLayout) View.inflate(this, R.layout.activity_third, null);
    }

    collection.addView(l, position);
    return l;
}

Solution 5

add those views to the pager adapter before accessing them.

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

    adapter = new MyPagerAdapter();
    pager = (ViewPager) findViewById(R.id.main_pager);
    pager.setAdapter(adapter);

    layout1 = (LinearLayout) findViewById(R.id.first_View);
    layout2 = (LinearLayout) findViewById(R.id.second_View);
    layout3 = (LinearLayout) findViewById(R.id.third_View);

}

in the pager adapter:

public Object instantiateItem(View collection, int position) {
    if(position == 0){
        View layout = inflater.inflate(R.layout.activity_first, null);

        ((ViewPager) collection).addView(layout);

        return layout;
    } 
    ... and so forth.

}

from here you can access them via findViewById.

Share:
59,501
user2629828
Author by

user2629828

Updated on July 08, 2022

Comments

  • user2629828
    user2629828 almost 2 years

    Can anyone help me to find out what can be the issue with this program. In the onCreate() method the findViewById() returns null for all ids and this causes a null pointer exception later. I can not figure out why the findViewById() can not find the view. Any suggestions?

    This is the main code:

    public class MainActivity extends Activity {
    
        ViewPager pager;
        MyPagerAdapter adapter;
        LinearLayout layout1, layout2, layout3;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            layout1 = (LinearLayout) findViewById(R.id.first_View);
            layout2 = (LinearLayout) findViewById(R.id.second_View);
            layout3 = (LinearLayout) findViewById(R.id.third_View);
    
            adapter = new MyPagerAdapter();
            pager = (ViewPager) findViewById(R.id.main_pager);
            pager.setAdapter(adapter);
        }
    
        private class MyPagerAdapter extends PagerAdapter
        {
    
            @Override
            public int getCount() { 
                return 3;
            }
    
            @Override
            public Object instantiateItem(ViewGroup collection, int position) {
    
                LinearLayout l = null;
    
                if (position == 0 )
                {
                    l = layout1;
                }
                if (position == 1)
                {
                    l = layout2;
                }
    
                if (position == 2)
                {
                    l = layout3;
                }
                    collection.addView(l, position);
                    return l;
            }
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return (view==object);
            }
    
             @Override
             public void destroyItem(ViewGroup collection, int position, Object view) {
                     collection.removeView((View) view);
             }
        }
    }
    

    And the related XML files:

    activity_main layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:orientation="vertical"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:background="#a4c639">
    
    
        <android.support.v4.view.ViewPager
                            android:layout_width="match_parent" 
                            android:layout_height="match_parent" 
                            android:id="@+id/main_pager"/>
    </LinearLayout>
    

    activity_first layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/first_View">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <Button
        android:id="@+id/button1"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
    
    </LinearLayout>
    

    activity_second layout:

     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/second_View">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    </LinearLayout>
    

    And the activity_third layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/third_View">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    </LinearLayout>