0

我的代码有关于后退按钮的问题。我在这个网站上尝试了很多答案。我有使用 startActivityforResult 调用第二个活动的 mainActivity。第二个活动启动蓝牙并显示绑定设备的列表,但如果我按下后退按钮,它会停止应用程序并出现错误。

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;
        }
    }

但是,当我在第二个活动中,并尝试按下后退按钮返回主活动时,我在主活动上收到错误,我的应用程序返回一个错误:

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

当您从第二个返回时Activity,您尚未将 an 设置为后退按钮案例中结果的数据,但在检查forIntent的值之前您要做的第一件事是尝试从 获取地址,该地址为 null 所以这会导致.resultCodeRESULT_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()and onKeyDown(),坚持使用其中之一。您只会混淆首先调用哪个代码路径。即使在结果设置为空白的情况下Intent,您仍然会NullPointerException在现有代码中获得 a,因为该附加包Intent仍然为空。

于 2013-01-24T04:53:51.810 回答