2011-12-23 81 views
0

我有一个可扩展列表的代码,我想在列表视图的子组中有一个复选框,并检查是否有一个复选框被选中。 问题是,当我检查复选框是否被选中时,我得到一个NULL指针异常。检查复选框是否被选中返回空指针

你能告诉我什么是错的吗?

这里是我的代码 - 我已经编辑了代码来扩充child_row.xml的视图,该视图拥有该复选框,但仍然得到空指针,我做错了什么?!?!

package send.Shift; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import android.app.ExpandableListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.Window; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ExpandableListView; 
import android.widget.SimpleExpandableListAdapter; 
import android.widget.TextView; 

public class Shifts extends ExpandableListActivity implements 
     OnCheckedChangeListener { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.list); 

     SimpleExpandableListAdapter expListAdapter = new SimpleExpandableListAdapter(
       this, createGroupList(), R.layout.group_row, 
       new String[] { "Group Item" }, new int[] { R.id.row_name }, 
       createChildList(), R.layout.child_row, 
       new String[] { "Sub Item" }, new int[] { R.id.grp_child }); 
     getExpandableListView().setGroupIndicator(
       getResources().getDrawable(R.drawable.expander_group)); 

     ExpandableListView EX = (ExpandableListView) findViewById(android.R.id.list); 
     EX.setAdapter(expListAdapter); 

     final CheckBox childBox = (CheckBox) findViewById(R.id.childBOX); 

     final TextView choosenGroup = (TextView) findViewById(R.id.choosen); 



     LayoutInflater inflater = LayoutInflater.from(Shifts.this); 
     View view2 = inflater.inflate(R.layout.child_row, null); 


     childBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       // TODO Auto-generated method stub 
       if(childBox.isChecked() == true){ 
       choosenGroup.setText("Shift Set"); 
       } 
      } 
     }); 

    } 

下面是一些logcat的日志:

12-23 07:38:00.644: W/dalvikvm(880): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
12-23 07:38:00.654: E/AndroidRuntime(880): FATAL EXCEPTION: main 
12-23 07:38:00.654: E/AndroidRuntime(880): java.lang.RuntimeException: Unable to start activity ComponentInfo{send.Shift/send.Shift.Shifts}: java.lang.NullPointerException 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.os.Looper.loop(Looper.java:123) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-23 07:38:00.654: E/AndroidRuntime(880): at java.lang.reflect.Method.invokeNative(Native Method) 
12-23 07:38:00.654: E/AndroidRuntime(880): at java.lang.reflect.Method.invoke(Method.java:507) 
12-23 07:38:00.654: E/AndroidRuntime(880): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-23 07:38:00.654: E/AndroidRuntime(880): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-23 07:38:00.654: E/AndroidRuntime(880): at dalvik.system.NativeStart.main(Native Method) 
12-23 07:38:00.654: E/AndroidRuntime(880): Caused by: java.lang.NullPointerException 
12-23 07:38:00.654: E/AndroidRuntime(880): at send.Shift.Shifts.onCreate(Shifts.java:41) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
12-23 07:38:00.654: E/AndroidRuntime(880): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
12-23 07:38:00.654: E/AndroidRuntime(880): ... 11 more 

回答

2

如果你在某行得到空指针,在该行的东西是null。如果是if(childBox.isChecked()一行,可能childBoxnull。很难说没有堆栈,但最可能的原因是您检索该复选框的行。

final CheckBox childBox = (CheckBox) findViewById(R.id.childBOX); 

可能会返回null,这可能有几个原因。这可能是你的id是childBox而不是childBOX。或者它不在R.layout.list中。

你可以做的最好的事情就是开始调试。什么是错误。找到null的对象。找出为什么它是null,如果这是预期或不。

+0

谢谢,我已经添加了logcat。我知道哪一行是空的,但我不知道为什么。我在某处读过它可能与这个CheckBox不在布局上我在setContent上膨胀的事实有关? – Yosi199 2011-12-23 07:52:47

+0

正如我在这里所说的:“它可能是你的id是childBox而不是childBOX,或者它不在R.layout.list中”。 'findViewById'函数实际上只会返回屏幕上的东西,在这种情况下,它应该在'R.layout.list'中。如果不是,那么我引用的行将返回'null',并且您正在有效地调用'null.isChecked()',这会显然给你一个空指针。 – Nanne 2011-12-23 07:55:37

+0

OKKKK所以现在我明白了。我的列表XML是保存ExpandableListView的东西,但它本身不包含复选框 - 复选框位于为列表视图的子项设置的不同布局xml中。我如何从不同的XML引用该复选框? – Yosi199 2011-12-23 08:00:08

0

而不是检查childBox.isChecked()您可以使用isChecked值。所以,你的代码应该是这样的:

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if(isChecked == true){ 
     choosenGroup.setText("Shift Set"); 
    } 
} 
0

检查您的布局list.xml我觉得这个布局可能缺少android:id="@+id/childBOX"的复选框,或者android:id="@+id/choosen"为TextView的

检查folowin样品

<CheckBox android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/childBOX"/> 
    <TextView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/choosen"/>