空指针异常 - findViewById()

时间:2013-09-29 13:16:20

标签: android nullpointerexception oncreate findviewbyid

任何人都可以帮我找出这个程序可能出现的问题。 在onCreate()方法中,findViewById()为所有id返回null,这会在以后导致空指针异常。我无法弄清楚findViewById()无法找到视图的原因。有什么建议吗?

这是主要代码:

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文件:

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>

activity_third布局:

<?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>

11 个答案:

答案 0 :(得分:78)

findViewById()返回一个View,如果它存在于setContentView()中提供的布局中,否则它将返回null,这就是发生在你身上的事情。

示例如果您setContentView(R.layout.activity_first);然后致电findViewById(R.id.first_View);,它将返回一个您的布局视图。

但是,如果您致电findViewById(R.id.second_View);,则会返回null,因为activity_first.xml布局中没有名为@+id/second_View的视图。

答案 1 :(得分:2)

您尝试获取的视图未在activity_main布局中定义。您需要以编程方式夸大您尝试添加到寻呼机的视图.-

@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;
}

答案 2 :(得分:2)

重点增加

对于Activity类中的那些情况。

  

Activity.findViewById(int id)

     

查找由<{> id 中处理的XML中的onCreate(Bundle)属性标识的视图。

否则,例如片段,适配器,来自View的{​​{1}}等

  

LayoutInflater

     

使用给定的View.findViewById(int id)查找子视图。如果此视图具有给定的id,请返回此视图。

无论哪种情况,

  

<强>返回
  如果找到该视图id

现在,重新检查您的XML文件。确保将正确的值放入nullsetContentView

如果是活动,请在inflater.inflate之后致电findViewById

然后,确保在该布局中有setContentView找到的视图。确保android:id="@+id/..."位于+,这会将资源添加到@+id值,以确保您可以从Java中找到它。

答案 3 :(得分:1)

在访问之前将这些视图添加到寻呼机适配器。

@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);

}
寻呼机适配器中的

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.

}

从这里你可以通过findViewById访问它们。

答案 4 :(得分:1)

有时您需要在Eclipse中清理项目(Project - Clean ..)。

答案 5 :(得分:1)

我今天收到了这个错误,清除起来很简单,我“面对面”。

尝试将UI元素添加到 res / layout-port目录中的布局xml文件中!!!

答案 6 :(得分:1)

就我而言,这是我的一个愚蠢的错误。我在OnCreate方法中编写了代码,但是高于 setContentView代码行。一旦我将代码移到此行下方,应用程序就开始正常工作了。

setContentView(R.layout.activity_main);

答案 7 :(得分:0)

@Warlock上面说的是对的,你应该以正确的方式初始化LinearLayout layout1,layout2,layout3:

LinearLayout layout1 = (LinearLayout) View.inflate(this, R.layout.first_View, null);
LinearLayout layout2 = (LinearLayout) View.inflate(this, R.layout.second_View, null);
LinearLayout layout3 = (LinearLayout) View.inflate(this, R.layout.third, null);

希望我的建议帮助你

答案 8 :(得分:0)

在Android中,findViewById(R.id.some_id)在布局集中查找视图时有效。

也就是说,如果您设置了布局说:

setContentView(R.layout.my_layout);

只能在此布局中找到视图(my_layout)。

在您的代码layout1中,layout2layout3都有三种不同的布局,并且未将其设置为活动。

答案 9 :(得分:0)

findViewById方法必须找到布局中的内容(您在setContentView中调用的内容)

答案 10 :(得分:-1)

当您在 XML 文件中具有相同名称的多个组件时,也会产生此问题。即使它们是不同的布局文件,您也应该给每个元素一个唯一的名称。 发生此错误是因为您在另一个布局文件中有一个同名的 XML 元素,而 android studio 正在尝试访问该元素并显示此错误