2012-04-15 38 views
1

Ich habe einen Listener, der einfach den Text einer Schaltfläche ändert und die Zeit für den Benutzer anzeigt. Ich habe auch eine Textansicht, die auf die neue Gesamtanzahl der Zeit geändert werden soll, wenn der Benutzer abmeldet. Ich habe das XML überprüft, um sicherzustellen, dass ich die richtige R.Id packe und der Button im Listener wird gerade nicht gefunden. Hier ist der Code:TextView gibt Null zurück

public class HoursListener implements OnClickListener{ 

GlobalApp appState; 
Button startStopHoursButton; 
TextView hoursTotalTextView; 
public boolean clockedIn; 

public HoursListener(Context ctx){ 
    appState = ((GlobalApp)ctx.getApplicationContext()); 
} 

public void onClick(View v) { 
    startStopHoursButton = (Button) v.findViewById(R.id.hourstogglebutton); 
    hoursTotalTextView = (TextView) v.findViewById(R.id.totalWorktimeTextView); 
    if(!clockedIn){ 
     startStopHoursButton.setText(R.string.clockout); 
     appState.getCurrentCompany().getCurrentNewWeeklyTimestamp().CreateFinishTimeStamp(); 
     clockedIn = true; 
    }else{ 
     startStopHoursButton.setText(R.string.clockin); 
     appState.getCurrentCompany().getCurrentNewWeeklyTimestamp().CreateFinishTimeStamp(); 
     clockedIn = false; 
     hoursTotalTextView.setText(appState.getCurrentCompany().getCurrentNewWeeklyTimestamp().totalTimeDoneThisWeekToString());     
    } 
} 

}

Heres die xml für die Textview:

<TextView 
     android:id="@+id/totalWorktimeTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/textView2" 
     android:text="" 
     android:textAppearance="?android:attr/textAppearanceSmall"/> 

Der Fehler ist mit dieser Zeile:

hoursTotalTextView.setText(appState.getCurrentCompany().getCurrentNewWeeklyTimestamp().totalTimeDoneThisWeekToString()); 

ich gerade dachte, Den Code in die Aktivität selbst einfügen, aber ich habe das Gefühl, dass ich es so machen kann. Ich möchte etwas, das ich wie einen Listener bezeichnen kann, um die Redundanz in meinem Code zu reduzieren. Ich habe überprüft, dass es die hoursTotalTextView ist, die null ist. Aber der Knopf ist nicht. Irgendwelche Ideen?

Screenshot von Eclipse (in Verbindung mit Full-Size-Version) zeigt, dass die entsprechenden Werte nicht null: Screenshot of Eclipse

+0

Was ist GlobalApp appState; –

+0

ist meine Anwendung Klasse, die ich für statische Variablen habe. – slai47

Antwort

1

Vermutlich ist die OnClickListener dessen klicken Sie hören ist die Taste? Das onClick übergibt die Ansicht, auf die geklickt wurde - also die Schaltfläche - und die Textbox ist kein untergeordnetes Element der Schaltfläche, sodass Sie sie nicht finden können.

Wenn HoursListener in Ihrer Aktivität erklärt wird, tun nur findViewById statt v.findViewById dh

hoursTotalTextView = (TextView) findViewById(R.id.totalWorktimeTextView); 

Wenn nicht, übergeben Sie den Textview in den HoursListener Konstruktor und setzen hoursTotalTextView dort (wenn man bedenkt das fühlt sich wie es könnte Speicherlecks verursachen).

+1

Alles, was ich brauchte, war, die TextView an den Listener zu übergeben. Ich danke dir sehr. – slai47

0

was GlobalApp AppState; und warum Sie den Kontext für GlobalApp von der unteren Zeile aus eingeben. Ich denke, appstate wird hier null sein.

appState = ((GlobalApp) ctx.getApplicationContext());

Wenn GlobalApp eine Klasse ist, dann erstellen Sie ein Objekt dafür und verwenden Sie dann Getter- und Setter-Methoden.

+0

GlobalApp ist meine Anwendung, die ich gemacht habe, damit ich auf bestimmte statische Variablen zugreifen kann, die für meine Anwendung benötigt werden. – slai47

+0

können Sie diese Klasse einfügen, da ich mit dieser Zeile verwechselt werden appState.getCurrentCompany(). GetCurrentNewWeeklyTimestamp(). CreateFinishTimeStamp(); –

+0

wie in der erweiterten Klasse Application? Sie müssen Ihren Code verfeinern entweder GlobalApp oder TextView möglicherweise null .... –

0

müssen Sie

startStopHoursButton = (Button) v.findViewById(R.id.hourstogglebutton); 
hoursTotalTextView = (TextView) v.findViewById(R.id.totalWorktimeTextView); 

einige, wo vor verwenden, können Konstruktor verursachen Ihre setText auf null Textview-Objekt arbeitet.

+0

Ich habe das, wenn die onClick-Methode aufgerufen wird. – slai47

+0

versuchen keepin es in Konstruktor coz Ihre TextView ist null oder möglicherweise falsche xml verwendet ich denke ... –

+0

Dies sollte helfen: [hier] (http://www.mediafire.com/i/?abvb5w8ign8k7yp) – slai47

0

prüfen jedes Objekt in dieser Zeile

if(appState.getCurrentCompany()==null) 
    Log.d("","getCurrentCompany is null"); 
if(appState.getCurrentCompany().getCurrentNewWeeklyTimestamp()==null) 
    Log.d("","getCurrentNewWeeklyTimestamp is null"); 
if(appState.getCurrentCompany().getCurrentNewWeeklyTimestamp().totalTimeDoneThisWeekToString()==null) 
    Log.d("","totalTimeDoneThisWeekToString is null"); 
+0

all diese sind nicht null. Debug zeigt, dass das TextView null ist. – slai47

+0

Dies sollte helfen: [hier] (http://www.mediafire.com/i/?abvb5w8ign8k7yp) – slai47

+0

Sie sollten auch beachten, dass Ihre Mainview auch null ist. Können Sie angeben, wie MainActivity HoursListener erstellt? Und Ist main.xml das einzige xml? Im Allgemeinen sollte TextView in der Aktivitätsklasse sein. Bitte geben Sie auch MainActivity.java an. –