0

私は前にそれをしました。ロケット科学ではありません。完璧な形を含む美しい活動。ここEditTextに...Spinnerそこに。しかし、今回はCheckBox'esがあります。

これは簡単なはずですonClick()。XMLで宣言されたメソッドをセットアップし、ビューのIDを取得します...

...つまり、私はaを使用し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スコープはアクティビティ全体ですが、コールバックから呼び出す関数のesNORの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

最後に識別される2つの行は、それぞれ次のとおりです。

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

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

次に、2番目の方法を示します。

    /** 
 * 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

問題が解決しました。学んだ貴重な教訓:

  1. ユーザーがチェックボックスに触れた瞬間にチェックボックスデータを取得しようとしたのは間違いでした。ユーザーが「保存」ボタンを押した後、Android OSを信頼し、データを収集する必要がありました。
  2. 「android:onClick」の使用は特定の状況で役立ちますが、そのようなアプローチが適切な場合は必ず確認する必要があります。
  3. 別のアクティビティと通信するだけでなく、アクティビティのどこでもインテントを使用できます。この場合、Intentクラスは私のベーコンを保存しました。リスナーとしてメソッドを宣言すると、Activity BUTTHEINTENTのほぼすべてからメソッドが切り離されます。アクティビティの既存のインテントを取得し、それにユーザー入力を追加してから、実際のINSERTを実行する場所からそのデータにアクセスして検証することができました。

    //現在のアクティビティのインテントを取得します

    インテントiNewPlyr=getIntent();

    //ユーザー入力を含むバンドルをインテントに入れます

    iNewPlyr.putExtras(mB);

    //他の場所からのデータを処理して挿入します

    検証();

チャイムを鳴らしてくれたすべての人に感謝します...すべてのストックオプションの価値が3倍になりますように!

于 2013-03-08T04:08:59.947 に答える
0

これを試してみてください:-

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

NullPointerExceptionチェックされた状態をに追加しようとすると、問題が発生するようですBundle。正しく初期化されていますBundleか?

于 2013-03-07T14:18:20.567 に答える
0

onClickxml属性は正常に機能するはずです。何回か問題なく使用しました。

あなたのxmlにはこの属性が設定されていると思いますonCheckBoxChng

をアクティビティの適切なメソッドとして宣言するようにしてpublic void onCheckBoxChng(View view)ください(静的メソッドではなく、内部クラスのメソッドなどではありませんActivity)。それが呼び出されるときthis、あなたのonCheckBoxChngメソッドのはあなたが期待するもの、これらのesActivityをホストするものでなければなりません。CheckBox

スタックトレースに基づくと、onCheckBoxChng実際に呼び出されているように見えますが、onCheckBoxChngメソッドは例外をスローします。これは、のnullポインタ例外が原因で発生しましたsetBundleChk

メソッド内の260行目にあるコードは何setBundleChkですか?もしそうなら、それString key: ActDlgAddPlyr.this.mBdlgForm.keySet()はのように見えmBdlgFormますnull。そこmBdlgForm Bundleにある、それは「見る」ことができます。ただnullです。mBdlgFormオンクリックが処理される前に、に適切な値を割り当てていることを確認してください。

于 2013-03-07T14:39:42.373 に答える