Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 选中对话框中的复选框后,尝试向SQLiteDataBase添加项的空指针_Android_Checkbox_Nullpointerexception_Android Sqlite_Onclicklistener - Fatal编程技术网

Android 选中对话框中的复选框后,尝试向SQLiteDataBase添加项的空指针

Android 选中对话框中的复选框后,尝试向SQLiteDataBase添加项的空指针,android,checkbox,nullpointerexception,android-sqlite,onclicklistener,Android,Checkbox,Nullpointerexception,Android Sqlite,Onclicklistener,我对复选框和在Sql中向数据库添加项有问题。问题是我在第171行得到一个空指针异常,它是: db.addTimer(new TimerClass(tagval1, String.valueOf(startTime*60))); 此条目基本上是以下行的镜像,如果现在已创建,我将使用该行向数据库添加默认值: db.addTimer(new TimerClass("Lipton", "180")); 也就是说,我要检查以触发第一行的复选框值是在下面列出的显示对话框代码中设置的:

我对复选框和在Sql中向数据库添加项有问题。问题是我在第171行得到一个空指针异常,它是:

    db.addTimer(new TimerClass(tagval1, String.valueOf(startTime*60)));
此条目基本上是以下行的镜像,如果现在已创建,我将使用该行向数据库添加默认值:

    db.addTimer(new TimerClass("Lipton", "180"));
也就是说,我要检查以触发第一行的复选框值是在下面列出的显示对话框代码中设置的:

    public void showDialog(){
    cusd = new Dialog(MainActivity.this,R.style.Theme_MultiTimer_Dialog);
    cusd.setContentView(R.layout.dialogbox);
    canlbtn = (Button) cusd.findViewById(R.id.cancelbtn);
    sbtbtn = (Button) cusd.findViewById(R.id.submitbtn);        
    minnp = (NumberPicker) cusd.findViewById(R.id.numberPicker1);
    secnp = (NumberPicker) cusd.findViewById(R.id.numberPicker2);
    tagvalue = (EditText) cusd.findViewById(R.id.tagname);
    ckb = (CheckBox) cusd.findViewById(R.id.savecheckBox);
    ckb.setOnClickListener(this);
    canlbtn.setOnClickListener(this);
    sbtbtn.setOnClickListener(this);
    minnp.setMaxValue(59);
    minnp.setMinValue(0);
    minnp.setWrapSelectorWheel(false);
    minnp.setOnValueChangedListener(this);
    secnp.setMaxValue(59);
    secnp.setMinValue(0);
    secnp.setWrapSelectorWheel(false);
    secnp.setOnValueChangedListener(this);
    cusd.show();
}
现在,我在同一个对话框中还有两(2)个数字选择器和一个EditText,我可以从中轻松地提取值。问题是当我尝试将条目添加到数据库本身时。下面是addtimer代码,它是要添加到数据库的通用代码,如上所述,它与我上面列出的第二行代码配合使用

       public void addTimer(TimerClass timers){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_TAG, timers.getTag());
    values.put(KEY_TIMEINSECONDS, timers.gettimeInSeconds());
    db.insert(TABLE_NAME, null, values);
    db.close();
}
请参阅下面我声明必要项的地方,以及我实例化不同代码的代码

    public class MainActivity extends Activity implements NumberPicker.OnValueChangeListener, OnClickListener, OnItemSelectedListener{
//--------------------------------------------------------------------------------------------------
Button dgbtn, abbtn, exbtn, canlbtn, sbtbtn, starest, clrbtn, deltbtn;
EditText tagvalue;
TextView timeRemaining, titleTvRight, titleTvLeft;
NumberPicker minnp, secnp;
Dialog cusd;
ProgressBar titleProgressBar;
TimerDataBaseHandler db;
Spinner s;
CheckBox ckb;
protected CountDownTimer timerCountDownTimer;
private boolean timerHasStarted = false;
private TextView timeElapsedView;
protected int startTime=0;
protected int val1, val2, val3, val4;
protected String tagval1;
boolean customTitleSupported, savechkbx;
File mydb ;
//--------------------------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    customTitleSupported= requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.main);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
    TimerDataBaseHandler db = new TimerDataBaseHandler(getApplicationContext());
    mydb = new File("/data/data/com.vertygoeclypse.multitimer/databases/TimerManager");
    if(mydb.exists()){
        Log.i("VertygoEclypse", "True");
    } else {
        Log.i("VertygoEclypse", "false");
        db.addTimer(new TimerClass("Lipton", "180"));
    }
//--------------------------------------------------------------------------------------------------
    dgbtn = (Button) findViewById(R.id.dialogbtn);
    abbtn = (Button) findViewById(R.id.aboutbtn);
    exbtn = (Button) findViewById(R.id.exitbtn);
    starest =  (Button) findViewById(R.id.startresetbtn);
    clrbtn = (Button) findViewById(R.id.clearvaluesbutton);
    deltbtn = (Button)     findViewById(R.id.deletevaluesbutton);
    timeRemaining = (TextView) findViewById(R.id.timeremainingview);
    titleTvLeft = (TextView)findViewById(R.id.titleTVLeft);
    titleTvRight = (TextView)findViewById(R.id.titleTVRight);
    titleProgressBar = (ProgressBar)findViewById(R.id.leadprogressBar);
    s = (Spinner)findViewById(R.id.timerspinner);
//--------------------------------------------------------------------------------------------------
    dgbtn.setOnClickListener(this);
    abbtn.setOnClickListener(this);
    exbtn.setOnClickListener(this);
    starest.setOnClickListener(this);
    clrbtn.setOnClickListener(this);
    deltbtn.setOnClickListener(this);
    s.setOnItemSelectedListener(this);
有谁能在这方面提供帮助吗?我确信这个问题是我遗漏的,但是,作为android编程新手,我想我看不到它

另外,请参见下面的logcat捕获,其中我被指向171行作为问题所在地

    01-07 21:58:49.650    1971-1971/com.vertygoeclypse.multitimer I/VertygoEclypse﹕ True
    01-07 21:58:49.678    1971-1971/com.vertygoeclypse.multitimer D/dalvikvm﹕ GC_FOR_ALLOC freed 74K, 10% free 2906K/3212K, paused 3ms, total 3ms
    01-07 21:58:49.698    1971-1971/com.vertygoeclypse.multitimer D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so
    01-07 21:58:49.698    1971-1971/com.vertygoeclypse.multitimer D/﹕ HostConnection::get() New Host Connection established 0xb8db9bf0, tid 1971
    01-07 21:58:49.710    1971-1971/com.vertygoeclypse.multitimer D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so
    01-07 21:58:49.710    1971-1971/com.vertygoeclypse.multitimer D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so
    01-07 21:58:49.774    1971-1971/com.vertygoeclypse.multitimer W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
    01-07 21:58:49.774    1971-1971/com.vertygoeclypse.multitimer E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
    01-07 21:58:49.782    1971-1971/com.vertygoeclypse.multitimer E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
    01-07 21:58:49.782    1971-1971/com.vertygoeclypse.multitimer D/OpenGLRenderer﹕ Enabling debug mode 0
    01-07 21:59:22.058    1971-1971/com.vertygoeclypse.multitimer D/dalvikvm﹕ GC_FOR_ALLOC freed 44K, 8% free 3327K/3612K, paused 7ms, total 7ms
    01-07 21:59:22.070    1971-1971/com.vertygoeclypse.multitimer D/dalvikvm﹕ GC_FOR_ALLOC freed 15K, 8% free 3715K/4028K, paused 2ms, total 2ms
    01-07 21:59:22.154    1971-1971/com.vertygoeclypse.multitimer W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
    01-07 21:59:22.238    1971-1971/com.vertygoeclypse.multitimer V/RenderScript﹕ 0xb8eb9850 Launching thread(s), CPUs 4
    01-07 21:59:23.826    1971-1971/com.vertygoeclypse.multitimer D/dalvikvm﹕ GC_FOR_ALLOC freed 60K, 7% free 4167K/4460K, paused 1ms, total 2ms
    01-07 21:59:27.154    1971-1971/com.vertygoeclypse.multitimer D/AndroidRuntime﹕ Shutting down VM
    01-07 21:59:27.154    1971-1971/com.vertygoeclypse.multitimer W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4bee648)
    01-07 21:59:27.158    1971-1971/com.vertygoeclypse.multitimer E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
        at com.vertygoeclypse.multitimer.MainActivity.onClick(MainActivity.java:171)
        at android.view.View.performClick(View.java:4240)
        at android.view.View$PerformClick.run(View.java:17721)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
提前感谢所有能帮助我的人,我感谢你的时间和努力

问候


cchinchoy

经过大量的代码尝试和错误,我终于找到了解决方案。我意识到复选框的代码是错误的,并且:

    ckb.setOnClickListener(this);
为此:

    ckb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
这样做的目的是发挥以下作用:

            ckb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
            if(isChecked){
                savechkbx = true;
            } else {
                savechkbx = false;
            }
        }
    });
我已将savechkbx声明为布尔值,然后将其设置为false。这是为了平衡我在xml文件中将复选框设置为true的事实,如下所示:

        <CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20sp"
    android:layout_marginRight="5sp"
    android:layout_marginTop="1sp"
    android:text="Saver Timer for Later use!!!"
    android:id="@+id/savecheckBox"
    android:checked="true" >
    </CheckBox>
否则它将一无所获。不过,我必须修改代码,使其更干净。这就解决了问题

            if(savechkbx==true){
            db.addTimer(new TimerClass(tagval1, temp2));
             }