将CheckBox数据转换为捆绑包

时间:2013-03-04 15:56:18

标签: java android forms scope bundle

我以前做过。这不是火箭科学。一个包含完美形式的美丽活动。这里有一个EditText ...那里有一个Spinner。但这次有CheckBox'es。

这应该很简单:设置XML中声明的onClick()方法,获取视图的ID ...

...事情是,我一直在使用Bundle收集表单中的所有数据并发送到我的IntentService以放入SQLite数据库。

/**
 * Called when the user changes the state of any CheckBox
 * @param view  The View that was checked/unchecked  */
public void onCheckBoxChng(View view) {
    // Is the view now checked?
    boolean checked = ((CheckBox) view).isChecked();
    String mField = new String();
    // Check which checkbox was clicked
    switch(view.getId()){
    case R.id.dlg_add_ply_chk1:
        mField = "Platinum";
        break;
    case R.id.dlg_add_ply_chk2:
        mField = "Gold";
        break;
    case R.id.dlg_add_ply_chk3:
        mField = "Silver";
        break;
    case R.id.dlg_add_ply_chk4:
        mField = "Bronze";
        break;
    case R.id.dlg_add_ply_chk5:
        mField = "HQ";
        break;
    case R.id.dlg_add_ply_chk6:
        mField = "Aurora-1";
        break;
    }
    if (checked) {
        setBundleChk(mField,1);
    } else {
        setBundleChk(mField,0);
    }
}

/**
 * Set the boolean fields in mBdlgForm based on user action on the checkboxes
 * 
 * @param   Field   The field name to change
 * @param   State   The state to set (<code>true</code> or <code>false</code> */
private void setBundleChk(String Field, int State){
    if (BuildConfig.DEBUG) {
        Log.i(Constants.TAG_ACTDLGADDPLYR,
                "setBundleChk(Field, State) called with: "+Field+", and "+State);
        Log.i(Constants.TAG_ACTDLGADDPLYR, "setBundleChk(): mBdlgForm Keys :");
        for (String key: mBdlgForm.keySet()){
            Log.d (Constants.TAG_FRGACTPLAYERS, "mBdlgForm."+key);
        }
    }
    if (State == 1) {
        mBdlgForm.putBoolean(Field, true);
    } else {
        mBdlgForm.putBoolean(Field, false);
    }
}

一块蛋糕,对吧?

问题是,虽然Bundle的范围是整个活动,但在我调用的任何函数中,onClick()'es NOR的CheckBox回调中都看不到它来自onClick()回调...

...请告诉我......我错过了什么?

即使实现了“Activity.this.method()”,我仍然会收到以下Logcat消息:

    03-04 20:09:32.349: E/AndroidRuntime(641): FATAL EXCEPTION: main
03-04 20:09:32.349: E/AndroidRuntime(641): java.lang.IllegalStateException: Could not execute method of the activity
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.view.View$1.onClick(View.java:3591)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.view.View.performClick(View.java:4084)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.widget.CompoundButton.performClick(CompoundButton.java:100)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.view.View$PerformClick.run(View.java:16966)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.os.Handler.handleCallback(Handler.java:615)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.os.Looper.loop(Looper.java:137)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.app.ActivityThread.main(ActivityThread.java:4745)
03-04 20:09:32.349: E/AndroidRuntime(641):  at java.lang.reflect.Method.invokeNative(Native Method)
03-04 20:09:32.349: E/AndroidRuntime(641):  at java.lang.reflect.Method.invoke(Method.java:511)
03-04 20:09:32.349: E/AndroidRuntime(641):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-04 20:09:32.349: E/AndroidRuntime(641):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-04 20:09:32.349: E/AndroidRuntime(641):  at dalvik.system.NativeStart.main(Native Method)
03-04 20:09:32.349: E/AndroidRuntime(641): Caused by: java.lang.reflect.InvocationTargetException
03-04 20:09:32.349: E/AndroidRuntime(641):  at java.lang.reflect.Method.invokeNative(Native Method)
03-04 20:09:32.349: E/AndroidRuntime(641):  at java.lang.reflect.Method.invoke(Method.java:511)
03-04 20:09:32.349: E/AndroidRuntime(641):  at android.view.View$1.onClick(View.java:3586)
03-04 20:09:32.349: E/AndroidRuntime(641):  ... 12 more
03-04 20:09:32.349: E/AndroidRuntime(641): Caused by: java.lang.NullPointerException
03-04 20:09:32.349: E/AndroidRuntime(641):  at net.clmitchell.ewtraker.pPlayers.ActDlgAddPlyr.setBundleChk(ActDlgAddPlyr.java:260)
03-04 20:09:32.349: E/AndroidRuntime(641):  at net.clmitchell.ewtraker.pPlayers.ActDlgAddPlyr.onCheckBoxChng(ActDlgAddPlyr.java:231)
03-04 20:09:32.349: E/AndroidRuntime(641):  ... 15 more

最后确定的两行分别为:

if (checked){ActDlgAddPlyr.this.setBundleChk(mField,1);}

for (String key: ActDlgAddPlyr.this.mBdlgForm.keySet()){

以下是第二种方法:

    /** 
 * Set the boolean fields in mBdlgForm based on user action on the checkboxes
 * 
 * @param   Field   The field name to change
 * @param   State   The state to set (<code>true</code> or <code>false</code> */
private void setBundleChk(String Field, int State){
    if (BuildConfig.DEBUG) {
        Log.i(Constants.TAG_ACTDLGADDPLYR, "setBundleChk(Field, State) called with: "+Field+", and "+State);
        Log.i(Constants.TAG_ACTDLGADDPLYR, "setBundleChk(): mBdlgForm Keys :");
        for (String key: ActDlgAddPlyr.this.mBdlgForm.keySet()){
            Log.d (Constants.TAG_FRGACTPLAYERS, "mBdlgForm."+key);
        }
    }
    if(State == 1){ActDlgAddPlyr.this.mBdlgForm.putBoolean(Field, true);}
    else{ActDlgAddPlyr.this.mBdlgForm.putBoolean(Field, false);}
}

4 个答案:

答案 0 :(得分:0)

试试这个: -

Activity.this.setBundleChk(mField,1);

答案 1 :(得分:0)

当您尝试将已检查状态添加到NullPointerException时,您的问题似乎是Bundle。您是否正确初始化了Bundle

答案 2 :(得分:0)

onClick xml属性应该可行。我用了几次没有任何问题。

我假设您的xml将此属性设置为onCheckBoxChng

请务必将public void onCheckBoxChng(View view)声明为您的活动的正确方法(不是静态方法,不是您的内部类Activity的方法等)。调用它时,this方法中的onCheckBoxChng应该是您期望的Activity,即承载这些CheckBox的{​​{1}}。

基于堆栈跟踪,似乎实际调用了onCheckBoxChng,但onCheckBoxChng方法抛出异常,这是由setBundleChk中的空指针异常引起的

setBundleChk方法中,第260行的代码是什么?如果是String key: ActDlgAddPlyr.this.mBdlgForm.keySet(),那么mBdlgForm似乎是nullmBdlgForm Bundle就在那里,可以“看到”。它只是null。在处理任何onclicks之前,请务必为mBdlgForm指定正确的值。

答案 3 :(得分:0)

问题解决了。 有价值的经验教训:

  1. 在用户触摸CheckBox时尝试获取CheckBox数据是错误的;我需要相信Android操作系统并在用户使用经过验证的技术按下“保存”按钮后收集数据。
  2. 使用“android:onClick”在某些情况下很有用,但必须确定这种方法是否合适。
  3. 您可以在Activity中使用Intent ANYWHERE,而不仅仅是与另一个Activity进行通信。在这种情况下,Intent类保存了我的培根:声明一个方法作为一个监听器从一个活动中的几乎所有内容中切断它但是意图;我能够获取Activity的现有Intent,添加用户输入,然后访问并验证我将运行实际INSERT的数据:

    //抓住当前活动的意图

    Intent iNewPlyr = getIntent();

    //将包含用户输入的包放入Intent

    iNewPlyr.putExtras(MB);

    //处理并插入来自其他地方的数据

    的validate();

  4. 我很感激所有参与其中的人......可能你所有的股票期权价值都是三倍!