Null pointer Exception - findViewById()
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 inonCreate(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 ornull
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.
user2629828
Updated on July 08, 2022Comments
-
user2629828 almost 2 years
Can anyone help me to find out what can be the issue with this program. In the
onCreate()
method thefindViewById()
returns null for all ids and this causes a null pointer exception later. I can not figure out why thefindViewById()
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>