У меня есть список в фрагменте в активности, который запускает детальную активность, которая содержит фрагмент с информацией об выбранном объекте.Фрагмент не получает правильный результат в 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, кто-нибудь есть идеи, где я пошло не так? Я уже консультировался эти ответы, прикладные и протестировали их, получил и дальше, но пока никакого решения еще:
- onActivityResult not being called in fragment
- Call fragments via super in host activity#onActivityResult
- General approach I took
- Verify method used
- Override and pass to fragment
вместо того чтобы использовать getParent для связи с деятельностью, вы должны использовать интерфейс и создать прослушиватель. – Martin
Вы хотите общаться с предыдущим мероприятием? getParent используется во второй операции детализации, но скобка else структуры if никогда не вызывается ... Вы все равно бы сделали то же самое? Это еще один способ добиться обратной связи, хотел использовать результат. –
В любом случае. Общение с родительскими фрагментами должно всегда проходить через слушателей, таких как @Martin. – QuirijnGB