首页 文章

onActivityResult在第二次调用时返回intent data = null

提问于
浏览
1

我知道有关于这个主题的答案,但行为与其他问题不同 .

我有一个片段,有两个按钮,两个不同的onClick方法 . 每个onClick方法都启动一个startActivityForResult()但是在片段中的onActivityResult(int requestCode,int resultCode,Intent data)方法中,只有其中一个活动的resultCode正确 .

让我用代码和一个例子来解释它:

片段:

@Override
public void onClick(View view) {
    int id = view.getId();
    switch (id) {

        case R.id.fab:
            Log.e(LOG_TAG, getActivity().toString());
            Intent intent = new Intent(getActivity(), AnadirAlimentoActivity.class);
            startActivityForResult(intent, 2);
            break;

    }
}

这个AnadirAlimentoActivity是完全符合预期的 .

AnadirAlimentoActivity:

当您结束向列表中添加项目时,您可以单击后退按钮并触发此方法:

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra(AppConstant.LISTA_ALIMENTOS_SELECCIONADOS, alimentosSeleccionados);
    setResult(RESULT_OK, intent);
    finish();
}

现在在片段中,使用正确的resultCode,requestCode和data触发OnActivityResult方法

片段:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 2) {
        ArrayList<Alimento> alimentos = data.getParcelableArrayListExtra(AppConstant.LISTA_ALIMENTOS_SELECCIONADOS);
        if (alimentos != null) {
            for (Alimento alimento : alimentos) {
                Log.e("alimento devuelto", alimento.getDescripcion() + " cantidad: " + String.valueOf(alimento.getCantidad())
                        + " proc: " + alimento.getProcedencia());
                mAlimentos.add(alimento);
            }
        }
        popularLista();
        isEnviarAlimento();
    } else {
        if (requestCode == 3) {
            if (data != null) {
                String remanente = data.getStringExtra(AppConstant.INSULINA_REMANENTE);
                if (remanente != null) {
                    _insulinaRemanente.setText(remanente);

                }
            }
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

然后问题是当你点击另一个按钮时,那个启动另一个活动的按钮(也在片段中,但在AsyncTask onPostExecute方法中)

片段(在这个片段类里面有一个私有类扩展了AsyncTask)

@Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);
        if (!aBoolean) {
            Toast.makeText(getActivity().getApplicationContext(), "Ha ocurrido un error por favor vuelve a intentarlo", Toast.LENGTH_LONG).show();
        } else {
            Intent intent = new Intent(getActivity(), MostrarInsulinaActivity.class);
            Log.e(LOG_TAG, getActivity().toString());
            startActivityForResult(intent, 3);
        }
        if (progressDialog != null && progressDialog.isShowing())
            progressDialog.dismiss();
    }

并在

MostrarInsulinaActivity

当你再次按下backButton时

MostrarInsulinaActivity:

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent _intent = new Intent();
    _intent.putExtra(AppConstant.INSULINA_REMANENTE, "holoa");
    setResult(RESULT_OK, _intent);
    finish();

}

我在做同样的事情,就像在另一个类中一样,期望完全像前一个一样,但是在finish()之后,get调用片段中的OnActitivyResult方法,使用正确的 requestCode ,但是 resultCode == 0 ,数据intent = null .

为什么会这样?是因为AsynTask?

我有点失落,我不知道从哪里开始 .

非常感谢

1 回答

  • 2

    我想回答一个可能面临同样问题的人的问题 .

    事情是,在我的第二个活动中,我在设置我的意图之前调用 super.onBackPressed(); 所以这是我所做的更改:

    @Override
    public void onBackPressed() {
      Intent _intent = new Intent();
      _intent.putExtra(AppConstant.INSULINA_REMANENTE, "holoa");
      setResult(RESULT_OK, _intent);
      finish();
      super.onBackPressed();
    }
    

相关问题