空指针异常 - findViewById() [英] Null pointer Exception - findViewById()
问题描述
谁能帮我找出这个程序可能存在的问题.在 onCreate()
方法中,findViewById()
为所有 id 返回 null,这会导致稍后出现空指针异常.我不明白为什么 findViewById()
找不到视图.有什么建议吗?
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?
这是主要代码:
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);
}
}
}
以及相关的 XML 文件:
And the related XML files:
activity_main 布局:
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 布局:
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 布局:
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>
还有activity_third布局:
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>
推荐答案
findViewById()
返回一个视图,如果它存在于您在 setContentView()
中提供的布局中,否则它返回null,这就是你发生的事情.请注意,如果您没有 setContentView()
,并且没有对 findViewById()
的有效视图,findViewById()
将始终返回 null,直到您调用 setContentView()
.
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()
.
这也意味着顶层中的变量会触发 NPE,因为它们在 onCreate()
之前被调用,并且通过扩展,在 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
例如,如果您 setContentView(R.layout.activity_first);
然后调用 findViewById(R.id.first_View);
它将返回一个视图,这是您的布局.
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.
但是如果你在setContentView()
之前调用findViewById(R.id.second_View);
,它会返回null
,因为没有activity_first.xml
布局中名为 @+id/second_View
的视图.
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
.
这篇关于空指针异常 - findViewById()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!