2013-09-29 55 views
36

任何人都可以幫助我找出什麼可以是這個程序的問題。 在onCreate()方法中,findViewById()對於所有ID都返回null,這會在稍後導致空指針異常。我無法弄清楚爲什麼findViewById()找不到視圖。有什麼建議麼?空指針異常 - 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佈局:

<?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佈局:

<?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升ayout:

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

回答

63

findViewById()返回查看,如果它在你setContentView()提供的佈局存在,否則,返回null,這就是發生在你身上。

示例如果您setContentView(R.layout.activity_first);然後致電findViewById(R.id.first_View);它將返回一個視圖,這是您的佈局。

但是,如果您致電findViewById(R.id.second_View);,它將返回null,因爲您的activity_first.xml佈局中沒有視圖@+id/second_View

+0

我已將所有佈局包含到主佈局中,並且我不再有空指針異常。謝謝你的提示。 – user2629828

+3

當我在當前顯示視圖以外的其他視圖上使用此視圖時,出現了這個視圖。爲了克服這種不想要的行爲,我按照以下方式引用了視圖而不使用setContentView。 layout1 =(LinearLayout)View.inflate(this,R.layout.first_View,null); 然後要訪問它裏面的任何東西,我可以使用 Button botton =(Button)layout1.findViewById(R.id.button1); 只需添加,以便它可能有助於sombody。 –

+0

爲什麼?強迫我們的好處是什麼? –

2

您試圖獲取的視圖未在您的activity_main佈局中定義。您需要以編程方式擡高你想添加到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; 
} 
+0

您如何訪問主要活動中的視圖? – Denny

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訪問它們。

0

什麼@Warlock上面說的是對的,你應該以正確的方式最初的LinearLayout佈局1,佈局2,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); 

希望我的建議可以幫助您

0

在Android中,findViewById(R.id.some_id)作品當你在佈局集中查找視圖。

也就是說,如果你設置了一個佈局說:

setContentView(R.layout.my_layout); 

視圖只能在這個佈局(my_layout)中找到。

在您的代碼layout1layout2layout3所有三種不同的佈局,他們沒有被設置到活動中。

0

findViewById方法必須找到什麼是在佈局(你在setContentView叫)

0

有時候你需要清潔Eclipse中的項目(工程 - 清潔..)。

1

今天我得到了這個錯誤,它很簡單,清楚,我「facepalmed」。

只需嘗試將UI元素添加到您的res/layout-port目錄中的佈局xml文件即可!

1

着重強調

對於Activity類內的那些情況下。

Activity.findViewById(int id)

查找一個從這是在onCreate(Bundle)處理的XML識別由id屬性的圖。


否則,如片段,適配器,從LayoutInflater一個View

View.findViewById(int id)

查找具有給定id子視圖。如果此視圖具有給定的ID,則返回此視圖。


無論哪種情況下,

返回
如果發現視圖null否則


現在,重新檢查你的XML文件。確保您將正確的值放入setContentViewinflater.inflate

在活動的情況下,在setContentView之後致電findViewById

然後,確保在該佈局中有一個您正在尋找的視圖android:id="@+id/..."。確保+處於@+id,這會將資源添加到R.id值,以確保您可以從Java中找到它。