Android получает RESULT_CANCELED, когда я специально добавляю RESULT_OK

Это моя проблема, у меня есть основной вид, который показывает только одну кнопку, нажимая эту кнопку, отображается другое представление. Этот вид имеет только другую кнопку, когда эта кнопка нажимает этот текущий вид, и управление возвращается к предыдущему виду.

Чтобы показать второе представление, я использую startActivityForResult, здесь я помещаю код.

private void startNewview() {       
    Intent it = new Intent(getApplicationContext(), newView.class);
    startActivityForResult(it,VIEW_ID);

}

Вызванный вызов имеет только событие кнопки, вот код

Button b = (Button) findViewById(R.id.close);
    b.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            setResult(RESULT_OK);               
            finish();

        }
    });

И, наконец, метод onActivityResult в главном представлении, вот код

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == VIEW_ID && resultCode == RESULT_OK) {
        tv = (TextView) findViewById(R.id.tv);
        tv.setText("The result ok is  here :)");
    }

}

Проблема resultCode всегда равна 0 = RESULT_CANCELED, и я не знаю, как ее решить, может ли кто-нибудь мне помочь?

Большое спасибо!

Ответы

Ответ 1

Я не могу объяснить, что происходит в вашем коде, но у меня есть образец проекта, чтобы сделать это.

a FooActivity с помощью только кнопки btnFoo:

@Override
protected void onStart() {
    super.onStart();

    btnFoo.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivityForResult(new Intent("xper.activity.ACTIVITY_BAR_INTENT"),1);
        }
    });
}

и BarActivity, добавленный в AndroidManifest.xml следующим образом:

<activity
    android:name = "BarActivity">
    <intent-filter>
        <action
            android:name = "xper.activity.ACTIVITY_BAR_INTENT"/>
        <category
            android:name = "android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Соответствующий код для извлечения намерения внутри панели находится в onClicEvent из btnBar (Button):

@Override
protected void onStart() {
    super.onStart();

    btnBar.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT");
            intent.putExtra("codBar", "bar");
            setResult(Activity.RESULT_OK, intent);
            finish();

        }
    });
}

Теперь, если вы плохо обработали событие onActivityResult(), когда вы нажимаете кнопку Android "BACK", вы можете получить ошибки.

Если намерение (намерение) в Activity B должно предоставить некоторую информацию активности A, если вы нажмете кнопку назад, я не знаю, будет ли активность B находиться в стеке, но намерение isn ' т. Поэтому я сделал следующее:

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();

    //Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT");
    //intent.putExtra("codBar", "bar");
    //setResult(Activity.RESULT_CANCELED, intent);
    setResult(Activity.RESULT_CANCELED);
    finish();
}

Обращаясь к информации, я сделал следующее в событии onActivityResult(), чтобы увидеть полученную информацию в деятельности панели:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(data != null) {
        Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode + "\tdata == " + data, 10000).show();
        btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode + "\tdata == " + data /*+ "extras == " + data.getExtras().getString("codBar")*/);
    } else {
        Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode, 10000).show();
        btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode);
    }

}

Если у вас есть больше действий для возврата информации к родительской активности, то хорошие оценки делают следующее:

//put private static final int globals atributes with the respective name of the
//activity to represent the requestCode for each activity you have like:
private static final int ACTIVITY1 = 117;
private static final int ACTIVITY2 = 118;
...
private static final int ACTIVITYN = 215;

//In the event onActivityResult() is better use the switch statement to handle each
//specific activity to catch information
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == Activity.RESULT_CANCELED) return; // breaks
    //if you decide to handle some information of Activity.RESULT_CANCELED
    //ignore the above condition that returns and handle it inside the switch statement

    switch(requestCode) {
    case ACTIVITY1:
    {
        //Dosomething
    } break;
    case ACTIVITY2:
    {
        //Dosomething
    } break;
    ...
    case ACTIVITYN:
    {
        //Dosomething
    } break;
    }
}

Если вы не можете сделать этот пример кода. пожалуйста, дайте мне свой адрес электронной почты для отправки проекта FooBarActivity

Ответ 2

здесь,

@Override
public void onBackPressed() {
    setResult(Activity.RESULT_OK);
    finish();
}

работает, чтобы вернуться (RESULT_OK), нажав кнопку BACK. НЕ звоните

super.onBackPressed().

Ответ 3

Используйте этот

  Intent returnIntent = new Intent();
  setResult(RESULT_OK,returnIntent); 

вместо

setResult(RESULT_OK);

только