У меня есть этот хороший метод в моем ListFragment, который я вызываю, чтобы заполнить детали моего другого фрагмента:
private void showClientDetails(int pos) {
myCursor.moveToPosition(pos);
int clientId = myCursor.getInt(0);
if(mIsTablet) {
// Set the list item as checked
getListView().setItemChecked(mCurrentSelectedItemIndex, true);
// Get the fragment instance
ClientDetails details = (ClientDetails) getFragmentManager().findFragmentById(R.id.client_details);
// Is the current visible recipe the same as the clicked? If so, there is no need to update
if (details == null || details.getClientIndex() != mCurrentSelectedItemIndex) {
// Make new fragment instance to show the recipe
details = ClientDetails.newInstance(mCurrentSelectedItemIndex, clientId, mIsTablet);
// Replace the old fragment with the new one
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.client_details, details);
// Use a fade animation. This makes it clear that this is not a new "layer"
// above the current, but a replacement
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
}
Он вызывается, когда пользователь щелкает клиент в представлении ListFragment:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mCurrentSelectedItemIndex = position;
showClientDetails(position);
}
Это прекрасно работает, но затем другая FragmentActivity может изменить отображаемые данные, поэтому я подумал, что это сработает:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
//update the client list incase a new one is added or the name changes
if(requestCode==1899)
{
myCursor.requery();
theClients.notifyDataSetChanged();
showClientDetails(mCurrentSelectedItemIndex); //now if client was edited update their details in the details fragment
}
}
Теперь я знаю строчку:
if (details == null || details.getClientIndex() != mCurrentSelectedItemIndex) {
Предотвращает достижение блока кода при его вызове в моем onActivityResult. Итак, если я удалю этот оператор if
, тогда все пойдет не так, и ft.commit() будет шипеть и выдаст мне ошибку:
`07-08 16:53:31.783: ОШИБКА/AndroidRuntime(2048): Причина: java.lang.IllegalStateException: невозможно выполнить это действие после onSaveInstanceState
Итак, я предполагаю, что то, что я пытаюсь сделать, не так резко и сухо, как это звучит, для меня это не имеет смысла, поскольку я могу делать это onListItemClicked весь день, и фрагмент постоянно очень хорошо отображает детали недавно щелкнутого клиента. .
Я даже пробовал это в своем onActivityResult
:
//simulate a click event really fast to refresh the client details
showClientDetails(0);
showClientDetails(mCurrentSelectedItemIndex);
это ничего не делает, я пытаюсь вызвать что-то из onActivityResult, которое не является потоком пользовательского интерфейса или что-то еще?
У меня есть это и в моем коде ListFragment.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("currentListIndex", mCurrentSelectedItemIndex);
}
Это то, на что жалуется ошибка?