0

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

Если выбрано одно из элементов действия, результат действия OK, если он снова выбран, результат переключается обратно в CANCELED. Я хочу передать этот результат только тогда, когда пользователь перейдет к списку. Я уже устранил несколько проблем, и я пришел в функцию onActivityResult в списке, но результат - это не тот, который я передал. После отладки я также заметил, что функция onActivityResult в listactivity никогда не запускается.

ListActivity:

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

ListFragment:

/** 
* 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); 
} 

И это, как я пытаюсь получить результат возврата к предыдущему listfragment:

@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() всегда нуль

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

+1

вместо того чтобы использовать getParent для связи с деятельностью, вы должны использовать интерфейс и создать прослушиватель. – Martin

+0

Вы хотите общаться с предыдущим мероприятием? getParent используется во второй операции детализации, но скобка else структуры if никогда не вызывается ... Вы все равно бы сделали то же самое? Это еще один способ добиться обратной связи, хотел использовать результат. –

+1

В любом случае. Общение с родительскими фрагментами должно всегда проходить через слушателей, таких как @Martin. – QuirijnGB

ответ

0

Вы должны вызвать супер в конце метода. Не начало.

@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(); 
} 
+0

Это действительно проблема. Я также удалил устаревший this.finish(); линия. –

0

** Я также столкнулся с тем же p roblem of OnActivityResult() вам нужно изменить свою реализацию. bc incase of Fragment. OnActivityResult() Хост-активности называется не фрагментом **

+0

Моя проблема заключается не в том, что метод не вызывается, а в том, что код результата не передан правильно ... –

Смежные вопросы