TextView返回null

时间:2012-04-15 16:12:34

标签: android nullpointerexception textview

我有一个监听器,只需更改按钮的文本并为用户计时。我还有一个textview,应该更改为用户退出时的新工作总时间。我仔细检查了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,它是null。然而按钮不是。有什么想法吗?

Eclipse的屏幕截图(链接到完整版本),显示相关值不为null: Screenshot of Eclipse

4 个答案:

答案 0 :(得分:1)

可能是你正在收听的点击的onClickListener是按钮? onClick传递被点击的View v - 即按钮 - 文本框不是按钮的子项,因此您无法找到它。

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

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

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

答案 1 :(得分:0)

什么是GlobalApp appState;以及为什么要从下面对GlobalApp进行类型转换。 我认为appstate在这里将为null。

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

如果GlobalApp是一个类,那么为它创建一个对象,然后使用getter和setter方法。

答案 2 :(得分:0)

你需要使用

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

之前的某些地方,可以是构造函数,因为你的setText正在处理null TextView对象。

答案 3 :(得分: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");