2013-09-29 3 views
36

Kann mir jemand helfen, herauszufinden, was das Problem mit diesem Programm sein kann. In der onCreate() Methode gibt findViewById() Null für alle IDs zurück, und dies verursacht später eine Nullzeigerausnahme. Ich kann nicht herausfinden, warum die findViewById() die Ansicht nicht finden kann. Irgendwelche Vorschläge?Nullzeiger Ausnahme - findViewById()

Dies ist der Hauptcode:

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

und die damit verbundene XML-Dateien:

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

Und das 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> 

Antwort

63

findViewById() gibt eine Ansicht, wenn es in dem Layout, das Sie in setContentView() sofern vorhanden, sonst gibt es null und das ist, was mit Ihnen geschieht.

Beispiel wenn Sie setContentView(R.layout.activity_first); und dann rufen Sie findViewById(R.id.first_View); es wird eine Ansicht, die Ihr Layout ist.

Aber wenn Sie findViewById(R.id.second_View); nennen es wird null zurückkehren, da es nicht eine Ansicht in Ihrem activity_first.xml Layout @+id/second_View genannt wird.

+0

Ich habe alle Layouts zum Hauptlayout hinzugefügt und habe keine Nullzeigerausnahme mehr. Danke für den Tipp. – user2629828

+3

Wenn ich dies in einer anderen Ansicht als in der gerade angezeigten Ansicht verwendete, erschien diese. Um mit diesem unerwünschten Verhalten fertig zu werden, verwies ich die Ansicht ohne setContentView wie folgt. layout1 = (LinearLayout) View.inflate (dies, R.layout.first_View, null); Dann auf alles in ihm zugreifen, könnte ich verwenden Button botton = (Button) layout1.findViewById (R.id.button1); Nur hinzufügen, so dass es für jemanden hilfreich sein könnte. –

+0

Warum? Was ist der Vorteil, uns zu zwingen? –

2

Die Ansichten, die Sie erhalten möchten, sind nicht in Ihrem Layout activity_main definiert. Sie müssen programmatisch die Ansichten aufblasen Sie vor dem Zugriff auf sie auf die 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

Wie würden Sie auf die Ansichten Ihrer Hauptaktivität zugreifen? – Denny

1

fügen Sie diese Ansichten an den Pager-Adapter hinzuzufügen versuchen.

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

} 

im 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. 

} 

von hier aus können Sie diese über findViewById zugreifen.

0

Was @Warlock oben gesagt ist richtig, sollten Sie erste Linearlayout Layout1, Layout2, Layout3 nach dem richtigen Weg:

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

meine beraten Hilfe wünschen Ihnen

0

In Android, findViewById(R.id.some_id) funktioniert, wenn Sie sind Ansicht im Layout-Set finden.

Das heißt, wenn Sie ein Layout festgelegt haben, sagen:

setContentView(R.layout.my_layout); 

Ansichten können nur in diesem Layout (my_layout) gefunden werden.

In Ihrem Code layout1, layout2, layout3 alle sind drei verschiedene Layouts und sie sind nicht auf die Aktivität eingestellt.

0

Die findViewById Methode muss das finden, was im Layout ist (die Sie im setContentView genannt)

0

Manchmal müssen Sie Ihr Projekt in Eclipse reinigen (Projekt - Saubere ..).

1

Ich habe diesen Fehler heute bekommen und es war so einfach zu klären, dass ich "facepalmed".

Versuchen Sie einfach, das UI-Element zu Ihrer Layout-XML-Datei in Ihrem res/layout-port-Verzeichnis hinzuzufügen !!!

1

Hervorhebungen

Für die Fälle innerhalb einer Aktivitätsklasse.

Activity.findViewById(int id)

Findet eine Ansicht, die durch das id Attribut aus die XML, die verarbeitet wurde in onCreate(Bundle) identifiziert wurde.


Ansonsten, wie ein Fragment, Adapter, ein View von einem LayoutInflater usw.

View.findViewById(int id)

Suchen Sie nach ein Kind Blick mit den angegebenen id. Wenn diese Ansicht die angegebene ID hat, geben Sie diese Ansicht zurück.


jedem Fall

Returns
Die Ansicht, wenn oder null sonst gefunden.


nun erneut überprüfen Sie Ihre XML-Dateien. Stellen Sie sicher, dass Sie den richtigen Wert in setContentView oder inflater.inflate eingeben.

Bei einer Aktivität rufen Sie findViewById nach setContentView.

Dann stellen Sie sicher, gibt es eine Ansicht, die Sie mit android:id="@+id/..." in diesem Layout suchen. Stellen Sie sicher, dass sich + bei @+id befindet, wodurch die Ressource den R.id-Werten hinzugefügt wird, um sicherzustellen, dass Sie sie von Java aus finden können.