0

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

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

...事情是,我一直在使用 aBundle将表单中的所有数据收集在一起并发送给我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' 范围是整个活动,但在我从回调调用的任何函数中的 'es NOR的onClick()回调中都看不到它......CheckBoxonClick()

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

即使在实施“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

4 回答 4

0

试试这个: -

Activity.this.setBundleChk(mField,1);
于 2013-03-04T16:01:21.270 回答
0

NullPointerException您尝试将选中状态添加到Bundle. 您是否正确初始化了Bundle?

于 2013-03-07T14:18:20.567 回答
0

onClick xml 属性应该可以正常工作。我用了几次没有任何问题。

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

只要确保将 声明public void onCheckBoxChng(View view)为您的活动的正确方法(不是静态方法,也不是您的内部类的方法Activity等)。当它被调用时,this你的onCheckBoxChng方法中的 应该是Activity你期望的,托管这些CheckBoxes 的那个。

根据堆栈跟踪,您似乎onCheckBoxChng实际上被调用了,但是,该onCheckBoxChng方法引发了一个异常,这是由setBundleChk.

在你的方法中,第 260 行有什么代码setBundleChk?如果是,String key: ActDlgAddPlyr.this.mBdlgForm.keySet()那么它看起来像mBdlgFormis null。它mBdlgForm Bundle在那里,它可以“看到”。它只是nullmBdlgForm确保在处理任何 onclick 之前分配适当的值。

于 2013-03-07T14:39:42.373 回答
0

问题解决了。宝贵的经验教训:

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

    // 获取当前Activity的Intent

    意图 iNewPlyr = getIntent();

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

    iNewPlyr.putExtras(mB);

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

    证实();

我感谢所有加入的人……愿你所有的股票期权价值翻三倍!

于 2013-03-08T04:08:59.947 回答