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

我正在考虑将代码放入活动本身,但我觉得我可以这样做。我想要一些我可以像监听器一样调用的东西,所以我减少了代码中的冗余。我已经仔细检查了 hoursTotalTextView 是否为空。然而按钮不是。有任何想法吗?

Eclipse 的屏幕截图(链接到全尺寸版本)显示相关值不为空: Eclipse 的屏幕截图

4

4 回答 4

1

大概是您正在收听其点击的 onClickListener 是按钮?onClick 传递被单击的 View v - 即按钮 - 并且文本框不是按钮的子项,因此您找不到它。

如果在您的活动中声明了 HoursListener,只需执行 findViewById 而不是 v.findViewById 即

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

如果没有,请将 textview 传递给 HoursListener 构造函数并在那里设置 hoursTotalTextView(记住这感觉可能会导致内存泄漏)。

于 2012-04-16T03:25:27.557 回答
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 回答
0

什么是 GlobalApp appState;以及为什么要从下一行将上下文类型转换为 GlobalApp。我认为 appstate 将在这里为空。

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 正在处理 null TextView 对象。

于 2012-04-15T16:17:04.983 回答