1

ボタンのテキストを変更し、ユーザーの時刻を計時するリスナーがいます。また、ユーザーが時間を計ったときに、新しい合計作業時間に変更されるはずのテキストビューもあります。xmlを再確認して、正しいR.Idを取得していて、リスナーのボタンがTextViewではなく検出されていることを確認しました。コードは次のとおりです。

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

アクティビティ自体にコードを入れることを考えていたのですが、こうすればできる気がします。リスナーのように呼び出すことができるものが欲しいので、コードの冗長性を減らします。nullであるのはhoursTotalTextViewであることを再確認しました。しかし、ボタンはそうではありません。何か案は?

関連する値がnullではないことを示すEclipseのスクリーンショット(フルサイズバージョンにリンク): Eclipseのスクリーンショット

4

4 に答える 4

1

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

アクティビティ内でHoursListenerが宣言されている場合は、v.findViewByIdではなくfindViewByIdを実行してください。

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

そうでない場合は、textviewをHoursListenerコンストラクターに渡し、そこでhoursTotalTextViewを設定します(これはメモリリークを引き起こす可能性があることに注意してください)。

于 2012-04-16T03:25:27.557 に答える
0

GlobalAppappStateとは何ですか。下の行からGlobalAppにコンテキストを型キャストしている理由。ここではappstateはnullになると思います。

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

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

于 2012-04-15T16:16:17.183 に答える
0

あなたが使用する必要があります

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

以前は、setTextがnullTextViewオブジェクトで動作している原因となるコンストラクターになる可能性があります。

于 2012-04-15T16:17:04.983 に答える
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");
于 2012-04-15T16:22:17.760 に答える