2012-04-15 15 views
1

私は、ボタンのテキストを変更してユーザーの時間を計るだけのリスナーを持っています。私はまた、ユーザーが時計を切ったときに働いた新しい総時間に変更するはずのテキストビューを持っています。私はxmlをダブルチェックして、正しいR.Idを取得していたことを確認し、リスナーのボタンがTextViewではないことがわかりました。TextViewがnullを返しています

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

}

相続人のTextViewのためのXML::ここではコードです

<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"/> 

エラーは、この行を次のとおりです。

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

私は考えていましたアクティビティ自体にコードを入れていますが、私はこのようにすることができるように感じています。リスナーのように呼び出せるものが欲しいので、私のコードでは冗長性を減らしています。私はそれがnullTotalTextViewであることをダブルチェックしました。しかし、ボタンはありません。何か案は?関連する値がnullでないことを示す(フルサイズバージョンにリンクされた)のEclipse

スクリーンショット:

Screenshot of Eclipse
+0

GlobalApp appStateとは何ですか? –

+0

私の静的変数のアプリケーションクラスです。 – slai47

答えて

1

クリックボタンであるために聞いているおそらくonClickListener? onClickは、クリックされたView(つまりボタン)を渡し、テキストボックスはボタンの子ではないため、そのボタンを見つけることはできません。

HoursListenerが、これはそれのように感じているだけではない場合は、代わりにv.findViewByIdすなわち

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

のfindViewByIdを行うHoursListenerコンストラクタへのTextViewを渡し、念頭に(そこhoursTotalTextViewを設定し、あなたの活動の中で宣言された場合メモリリークを引き起こす可能性があります)。

+1

私が必要としたのはTextViewをリスナーに渡すことでした。どうもありがとうございます。 – slai47

0

GlobalApp appStateが何であります。なぜ、下の行からGlobalAppにコンテキストを型キャストするのですか? 私はappstateがここでnullになると思います。

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

GlobalAppがクラスの場合は、そのオブジェクトを作成してから、getterメソッドとsetterメソッドを使用します。あなたは

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

を使用する必要が

+0

GlobalAppは私のアプリケーションです。私は実行するために私のアプリに必要な特定の静的変数にアクセスできます。 – slai47

+0

私はこの行と混同しているため、そのクラスを貼り付けることができますか?appState.getCurrentCompany()。getCurrentNewWeeklyTimestamp()。CreateFinishTimeStamp(); –

+0

拡張クラスのアプリケーションでは?あなたのコードを修正する必要がありますか?GlobalAppまたはTextViewのいずれかがnullの可能性があります.... –

0

は、いくつかの場所の前に、コンストラクタはあなたのsetTextがnullのTextViewオブジェクト上で作業している原因となることができます。

+0

私はonClickメソッドが呼び出されるたびにこれを持っています。 – slai47

+0

あなたのtextViewがnullであるか、または間違ったxmlを使用している可能性があります。... –

+0

これは助けてください:[here](http://www.mediafire.com/i/?abvb5w8ign8k7yp) – slai47

0

チェック、その行の各オブジェクト

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

これらのすべてnullではありません。デバッグは、TextViewがnullであることを示します。 – slai47

+0

これは助けてください:[ここ](http://www.mediafire.com/i/?abvb5w8ign8k7yp) – slai47

+0

また、あなたのmainviewもnullであることに注意する必要があります。 MainActivityがHoursListenerを作成する方法を教えてください。 main.xmlは唯一のXMLですか?通常、TextViewはアクティビティクラスにある必要があります。 MainActivity.javaも提供してください。 –

関連する問題