我以前做过。这不是火箭科学。一个包含完美形式的美丽活动。这里有一个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);}
}
答案 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
似乎是null
。 mBdlgForm
Bundle
就在那里,可以“看到”。它只是null
。在处理任何onclicks之前,请务必为mBdlgForm
指定正确的值。
答案 3 :(得分:0)
问题解决了。 有价值的经验教训:
您可以在Activity中使用Intent ANYWHERE,而不仅仅是与另一个Activity进行通信。在这种情况下,Intent类保存了我的培根:声明一个方法作为一个监听器从一个活动中的几乎所有内容中切断它但是意图;我能够获取Activity的现有Intent,添加用户输入,然后访问并验证我将运行实际INSERT的数据:
//抓住当前活动的意图
Intent iNewPlyr = getIntent();
//将包含用户输入的包放入Intent
iNewPlyr.putExtras(MB);
//处理并插入来自其他地方的数据
的validate();
我很感激所有参与其中的人......可能你所有的股票期权价值都是三倍!