Фрагмент не получает правильный результат в onActivityResult

У меня есть список во фрагменте действия, которое запускает подробное действие, содержащее фрагмент с информацией о выбранном объекте.

Если выбран один из элементов действия, результатом действия является ОК, если он выбран снова, результат снова переключается на ОТМЕНА. Я хочу передать этот результат только тогда, когда пользователь вернется к списку. Я уже устранил несколько проблем, и я получаю функцию onActivityResult в фрагменте списка, но код результата не тот, который я передал. При отладке я также заметил, что функция onActivityResult в listactivity никогда не запускается.

Активность списка:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("LA", "onActivityResult: " + resultCode);
    super.onActivityResult(requestCode, resultCode, data);
}

Фрагмент списка:

/**
 * Launch detail activity
 */
public class OnObjectClickListener implements OnItemClickListener {

    public OnObjectClickListener() {
        super();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.i("OnObjectClickListener", "Selected an object");
        ObjectAdapter adapter = (ObjectAdapter) _objList.getAdapter();
        Object o = adapter.getItem(position);

        Intent i = new Intent(adapter.getContext(), DetailActivity.class);
        i.putExtra(DetailActivity.ARG_OBJCODE, o.getCode());
        startActivityForResult(i, DetailActivity.ARG_FOLLOW_OBJ_CHANGE);
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("LF", "Activity result received");
    if (requestCode == DetailActivity.ARG_FOLLOW_OBJ_CHANGE
        && resultCode == Activity.RESULT_OK
        && data != null
        && data.hasExtra(DetailActivity.ARG_OBJCODE)){
        // Update object in the list: following indicator has changed
        String objcode = data.getStringExtra(DetailActivity.ARG_OBJCODE);
        ObjectAdapter oa = (ObjectAdapter) _objList.getAdapter();
        for (Object o : oa.getObjects()){
            // Toggle following state in the game
            if (o.getCode().equals(objcode)){
                o.setFollowing(!o.isFollowing());
                oa.notifyDataSetChanged();
                Log.i("LF", "Edited dataset");
                break;
            }
        }
        Log.i("LF", "Result processed");
    } else {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("LF", "Result not recognized");
    }
}

Подробная информация о действиях:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    DetailFragment df = (DetailFragment) getFragmentManager().findFragmentByTag(_objCode);

    switch (item.getItemId()) {
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    case R.id.action_follow_obj:
        if (df != null){
            df.followObj(true);
            configResult();
        }
        break;
    case R.id.action_unfollow_obj:
        if (df != null){
            df.followObj(false);
            configResult();
        }
        break;
    }
    return super.onOptionsItemSelected(item);
}
/** Sets the result of this activity (did the following parameter change, or not?)
 * @return nothing */
private void configResult() {
    // switch follow state monitor: statechange is true upon uneven changes
    // meaning the state is not really changed if the game is first followed and subsequently unfollowed
    _followStateChanged = !_followStateChanged;
    Log.i("DA", "State changed: " + _followStateChanged);
}

И вот как я пытаюсь вернуть результат к предыдущему фрагменту списка:

@Override
public void onBackPressed() {
    super.onBackPressed();

    // config result
    Intent i = new Intent();
    i.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    i.putExtra(DetailActivity.ARG_OBJCODE, _objCode);
    int result = _followStateChanged ? Activity.RESULT_OK : Activity.RESULT_CANCELED;
    if (getParent() == null){
        setResult(result, i);
    } else {
        getParent().setResult(result, i);
    }
    this.finish();
    Log.i("DA", "Back pressed, intent passed and set as a result");
}

... getParent() всегда имеет значение null

Код результата всегда равен 0, кто-нибудь знает, где я ошибся? Я уже проконсультировался с этими ответами, применил и протестировал их, получил дальнейшее решение, но пока не нашел решения:


person Diëgo    schedule 23.11.2014    source источник
comment
вместо использования getParent для связи с действием вы должны использовать интерфейс и создать прослушиватель.   -  person Martin    schedule 24.11.2014
comment
Вы имеете в виду общаться с предыдущей активностью? getParent используется во втором подробном действии, но скобка else структуры if никогда не вызывается... Будете ли вы по-прежнему делать то же самое? Это еще один способ добиться обратной связи, захотелось использовать результат.   -  person Diëgo    schedule 24.11.2014
comment
Так или иначе. Связь с родительскими фрагментами всегда должна проходить через слушателей, таких как упомянутый @Martin.   -  person QuirijnGB    schedule 25.11.2014


Ответы (2)


Вы должны вызвать super в конце метода. Не начало.

@Override 
public void onBackPressed() {

    // config result 
    Intent i = new Intent();
    i.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    i.putExtra(DetailActivity.ARG_OBJCODE, _objCode);
    int result = _followStateChanged ? Activity.RESULT_OK : Activity.RESULT_CANCELED;
    if (getParent() == null){
        setResult(result, i);
    } else { 
        getParent().setResult(result, i);
    } 
    this.finish();
    Log.i("DA", "Back pressed, intent passed and set as a result");

    super.onBackPressed(); 
} 
person QuirijnGB    schedule 25.11.2014
comment
Это действительно было проблемой. Я также удалил устаревший this.finish(); линия. - person Diëgo; 25.11.2014

** Я также столкнулся с той же проблемой OnActivityResult(), вам нужно изменить свою реализацию, потому что в случае фрагмента OnActivityResult() активности хоста называется не фрагментом **

person Arun Salaria    schedule 24.11.2014
comment
Моя проблема не в том, что метод не вызывается, а в том, что код результата передается неправильно... - person Diëgo; 24.11.2014