0

戻るボタンに関するコードに問題があります。私はこのサイトでたくさんの答えを試しました。startActivityforResultを使用して2番目のアクティビティを呼び出すmainActivityがあります。この2番目のアクティビティは、Bluetoothを開始し、結合されたデバイスのリストを表示しますが、戻るボタンを押すと、エラーでアプリが停止します。

public class Main extends Activity implements OnSeekBarChangeListener{
...

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        String address = data.getExtras().getString(BondedDevices.DEVICE_ADDRESS);
        if (resultCode==Activity.RESULT_CANCELED){
            Toast.makeText(getApplicationContext(), "Finalizando dispositivos pareados", Toast.LENGTH_SHORT).show();
            return;
        }
        switch (requestCode) {
        case DISPOSITIVOS_PAREADOS:
            if(resultCode==Activity.RESULT_OK){
                mConnectThread = new ConnectThread(address);
                mConnectThread.start();
                estado = EST_CONECTADO;   //informa que esta conectado
                atualizaEstado();
                break;
            } 
        return;
        }
    }

しかし、2番目のアクティビティにいて、戻るボタンを押すだけでメインアクティビティに戻ろうとすると、メインアクティビティでエラーが発生し、アプリがエラーを返します。

public class BondedDevices extends ListActivity {
....

@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        if(D) Log.e(TAG, "+++ ON BACK PRESSED +++");
        setResult(Activity.RESULT_CANCELED);
        this.finish();
    }

またはこのように:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN)
        {
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_BACK:
                Intent returnIntent = new Intent();
                setResult(Activity.RESULT_CANCELED, returnIntent);
                finish();
                return true;
            }
        }

        return false; 
    }

さまざまなコードを試しましたが、それでも機能しません。誰か助けてください。ありがとうございました。

4

2 に答える 2

1

あなたは電話するべきですsuper.onBackPressed();

このような

@Override
public void onBackPressed() {
    super.onBackPressed();
    if(D) Log.e(TAG, "+++ ON BACK PRESSED +++");
    setResult(Activity.RESULT_CANCELED);
    this.finish();
}
于 2013-01-24T04:44:10.983 に答える
0

2 番目の から戻ったとき、戻るボタンの場合の結果のデータとして をActivity設定していませんが、 forの値を確認する前に最初に行うことは、 からアドレスを取得しようとすることです。を引き起こします。IntentresultCodeRESULT_CANCELEDIntentNullPointerException

onActivityResult()次のようにするには、行を並べ替える必要があります。

if (resultCode==Activity.RESULT_CANCELED){
    Toast.makeText(getApplicationContext(), "Finalizando dispositivos pareados", Toast.LENGTH_SHORT).show();
    return;
}
//Do this after checking for cancel
String address = data.getExtras().getString(BondedDevices.DEVICE_ADDRESS);

/* The rest of the existing code */

onBackPressed()また、との両方をオーバーライドしてはいけません。どちらonKeyDown()か一方に固執してください。どのコードパスが最初に呼び出されるかについて混乱を引き起こしているだけです。結果が空白で設定されている場合でも、そのエクストラ バンドルが null のままであるため、既存のコードでIntentが取得されます。NullPointerExceptionIntent

于 2013-01-24T04:53:51.810 に答える