Я попробовал «фиксированный» jar здесь:
http://code.google.com/p/android/issues/detail?id=15394
, а также полностью переустановил SDK, и ни один из подходов все еще не устранил проблему, возникшую у меня здесь.Так что startActivityForResult
просто не идет от ListFragment
?
Оригинальный пост:
У меня есть ClientListView
, который является ListFragment
, что когда кнопка на панели действийпри щелчке по нему выбирается то, что выбрано в представлении ListFragment
, и запускается новое действие по редактированию выбранного клиента (или, если другой клиент щелкает по новому клиенту все вместе).
Все это запускается нормально.Фрагмент ClientListView
и ClientDetailsFragment
заменены моей EditClientActivity
FragmentActivity (которая вызывает фрагмент ClientEdit
).Это занимает весь экран и создает кнопку сохранения / отмены на панели действий.
Проблема заключается в том, что при нажатии кнопки сохранения я не могу обновить ListFragment
с помощью вновь созданного клиента или отредактированного клиента.Для полноты это мой порядок вызова:
MainActivity FragmentActivity
устанавливает ClientListView ListFragment
и ClientDetailsActivity FragmentActivity
(который имеет фрагмент ClientDetails
).Затем ClientListView ListFragment
после выбора новой или редактируемой клиентской опции может запуститьActivityForResult для EditClientActivity
(в котором есть фрагмент ClientEdit
).
Фрагмент ClientEdit
устанавливает меню параметров для отмены сохранения, после выбора сохранения во фрагменте ClientEdit
происходит несколько вещей:
новый клиент или отредактированный клиент сохраняется вбаза данных.mEditListener.onEditComplete()
называется.Поскольку вызывающий FragmentActivity
EditClientActivity
реализует onEditCompleteListener
, который я использую onAttach
во фрагменте ClientEdit
.
Итак, мой EditClientActivity
имеет метод onEditComplete(long id)
:
public void onEditComplete(long id) {
Intent in = new Intent();
this.setResult(1, in); //just something to let the ClientListView that the client i saved refresh the list.
Toast.makeText(this.getBaseContext(), "Client Saved", Toast.LENGTH_LONG).show();
finish(); //go back to our listview and client details view
}
В моем ClientListView
(типа ListFragment) у меня есть это:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.setHasOptionsMenu(true);
//which columns to put as the cursor
String[] columns = new String[] { "firstname", "lastname" };
//how to post those columns into the layout. check client_row.xml for these ids
int[] to = new int[] { R.id.client_first_name_list_label, R.id.client_last_name_list_label};
myCursor = getClientsCursor(); //this is NOT closing the database connection if it does it gets an error
theClients = new SimpleCursorAdapter(this.getListView().getContext(),
R.layout.client_row, myCursor, columns, to);
setListAdapter(theClients);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.new_client:
// TODO: add recipe
showClientEdit(-1);
return true;
case R.id.client_delete:
// TODO: delete recipe
Toast.makeText(getActivity(), "Delete Client selected", Toast.LENGTH_LONG).show();
return true;
case R.id.client_edit:
if(mCurrentSelectedItemIndex!=-1)
showClientEdit(mCurrentSelectedItemIndex);
else
Toast.makeText(getActivity(), "Select client to edit!", Toast.LENGTH_LONG).show();
return true;
case android.R.id.home:
// TODO: Handle app icon click
Toast.makeText(getActivity(), "Home icon selected", Toast.LENGTH_LONG).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
void showClientEdit(long someId)
{
..do stuff to get the right client to pass to the intent
Intent intent = new Intent(getActivity(), EditClientActivity.class);
// Send the recipe index to the new activity
intent.putExtra(EditClientActivity.SELECTED_CLIENT, clientId);
startActivityForResult(intent, Activity.RESULT_OK);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
//never gets here :(
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(this.getListView().getContext(), "Result code: " +resultCode , Toast.LENGTH_LONG).show();
if(resultCode ==1)
{
myCursor = getClientsCursor(); //not sure if i need this for the next line or not, want my list to update with newly
//added client or edited client names etc...
theClients.notifyDataSetChanged();
Toast.makeText(this.getListView().getContext(), "Data set notified!!!" , Toast.LENGTH_LONG).show();
}
}
Проблема в том, что мой startActivityForRestult
вызывает EditClientActivity
из ListFragment?Насколько я могу судить, никогда не звонит onActivityResult
.Я предоставил всю эту информацию, чтобы попытаться выяснить и понять, как Fragment / FragmentActivities и тому подобное должны взаимодействовать друг с другом.Я делаю это таким образом, исходя из того, что я узнал, изучая руководства, руководства для разработчиков и т. Д. Я очень доволен своим прогрессом, но сейчас за стеной ... и, вероятно, осознавать, что я делаю вещи, просто не правильно...Я хотел бы быть просветленным.Для меня это самая трудная часть Android - это управление тем, как все эти действия и представления взаимодействуют друг с другом ....