2015-01-12 11 views
20

Dies ist, was ich versuche, für mehrere Stunden zu tun: Ich habe eine MainActivity.java Datei (Auflistung unten) und eine Fragment_start.xml Datei mit einem Start Knopf. Durch Antippen der Start-Schaltfläche sollte die Datei activity_main.xml mit point-/round- und countdown-Textviews angezeigt werden. Es funktioniert nicht, und das ist, was passiert:- java.lang.NullPointerException - setText auf null Objektreferenz

Die logcat sagt mir: PID: 1240 java.lang.NullPointerException: Versuch zum Aufruf virtuelle Methode ‚Leeren android.widget.TextView.setText (java.lang .CharSequence)

Der Emulator zeigt: Leider hat GAME gestoppt.

Nötig zu erwähnen, dass ich ziemlich neu in der Programmierung bin?

Danke für jede Beratung!

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 


public class MainActivity extends Activity implements View.OnClickListener { 

private int points; 
private int round; 
private int countdown; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    showStartFragment(); 
} 

private void newGame() { 
    points=0; 
    round=1; 
    initRound(); 
} 

private void initRound() { 
    countdown = 10; 
    update(); 
} 

private void update() { 
    fillTextView(R.id.points, Integer.toString(points)); 
    fillTextView(R.id.round, Integer.toString(round)); 
    fillTextView(R.id.countdown, Integer.toString(countdown * 1000)); 
} 

private void fillTextView (int id, String text) { 
    TextView tv = (TextView) findViewById(id); 
    tv.setText(text); 
} 

private void showStartFragment() { 
    ViewGroup container = (ViewGroup) findViewById(R.id.container); 
    container.removeAllViews(); 
    container.addView(
      getLayoutInflater().inflate(R.layout.fragment_start, null)); 
    container.findViewById(R.id.start).setOnClickListener(this); 
} 

@Override 
public void onClick(View view) { 
    if(view.getId() == R.id.start) { 
     startGame(); 
    } 
} 

public void startGame() { 
    newGame(); 
} 
} 
+5

Posting ganz Ausnahmemeldung/logcat würde helfen. – arleitiss

+0

Bitte posten Sie Ihre XML-Dateien. – Rohit5k2

+0

Sehen Sie sich meine Antwort an. Die Erklärung kann nicht klarer sein, aber Sie müssen selbst herausfinden, warum Sie eine falsche ID als Parameter eingeben (denn wenn eine Ansicht mit dieser ID existiert, würde die Methode keinen Nullwert liefern) – ProgrammingIsAwsome

Antwort

15

Hier liegt das Problem:

private void fillTextView (int id, String text) { 
    TextView tv = (TextView) findViewById(id); 
    tv.setText(text); // tv is null 
} 

-> (Textview) findViewById (id); // gibt null zurück Aber aus Ihrem Code kann ich nicht finden, warum diese Methode Null zurückgibt. Versuchen Sie herauszufinden, welche ID Sie als Parameter geben und ob diese Ansicht mit der angegebenen ID existiert.

Die Fehlermeldung ist sehr klar und sagt Ihnen sogar, bei welcher Methode. Aus der Dokumentation:

public final View findViewById (int id) 
    Look for a child view with the given id. If this view has the given id, return this view. 
    Parameters 
     id The id to search for. 
    Returns 
     The view that has the given id in the hierarchy or null 

http://developer.android.com/reference/android/view/View.html#findViewById%28int%29

Mit anderen Worten: Sie haben keine Ansicht mit der ID als Parameter geben.

19

Das Problem ist der tv.setText (Text). Die Variable tv ist wahrscheinlich null, und Sie rufen die setText-Methode für diese Null auf, was Sie nicht können. Meine Vermutung, dass das Problem auf der findViewById-Methode ist, aber es ist nicht hier, also kann ich nicht mehr sagen, ohne den Code.

+0

Ja das ist das Problem. Die Fehlermeldung ist hier sehr klar. – ProgrammingIsAwsome

+0

Sie können versuchen, zu überprüfen, ob Sie zwei oder mehr textview mit der gleichen ID deklariert haben – cammando

3
private void fillTextView (int id, String text) { 
    TextView tv = (TextView) findViewById(id); 
    tv.setText(text); 
} 

Wenn dies ist, wo Sie die Null-Zeiger Ausnahme sind immer gab es keinen Blick für die ID gefunden, die Sie in findViewById() vergangen, und die tatsächlichen Ausnahme ausgelöst, wenn Sie versuchen, eine Funktion setText() auf null anrufen . Sie sollten Ihren XML-Code für veröffentlichen, da es schwierig ist, nur durch einen Blick auf Ihren Code festzustellen, wo die Dinge schief gelaufen sind.

Mehr Lesen auf Null-Zeiger: What is a NullPointerException, and how do I fix it?

Verwandte Themen