Rafraîchir mes fragment ne fonctionne pas comme je le pensais, il devrait
J'ai cette belle méthode dans mon ListFragment j'appelle de remplir les détails de mon autre fragment:
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();
}
}
}
Il est appelé lorsque l'utilisateur clique sur un client dans le ListFragment vue:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mCurrentSelectedItemIndex = position;
showClientDetails(position);
}
Cela fonctionne très bien, mais alors un autre FragmentActivity pouvez modifier les données que cette affiche j'ai donc pensé que ce serait le travail:
@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
}
}
Maintenant, je sais que la ligne:
if (details == null || details.getClientIndex() != mCurrentSelectedItemIndex) {
Empêche le bloc de code étant atteint lorsque son appelé mon onActivityResult. Donc, si je retire que if
déclaration, puis les choses freak out et le ft.commit() a un hissy fit et me donne l'erreur:
`07-08 16:53:31.783: ERREUR/AndroidRuntime(2048): Causée par: java.lang.IllegalStateException: vous ne Pouvez pas effectuer cette action après onSaveInstanceState
Donc je suppose que ce que je suis en train de faire n'est pas aussi coupé et sec, comme il semble, il ne fait aucun sens pour moi, car je peux le faire onListItemClicked toute la journée et le fragment affiche les détails de la nouvelle cliqué client constamment très bien...
J'ai même essayé dans mon onActivityResult
:
//simulate a click event really fast to refresh the client details
showClientDetails(0);
showClientDetails(mCurrentSelectedItemIndex);
qui ne fait rien, est-il im essayant d'appeler quelque chose à partir de la onActivityResult ce qui n'est pas un thread d'Interface utilisateur ou ce pas?
J'ai ceci dans mon code de la ListFragment ainsi
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("currentListIndex", mCurrentSelectedItemIndex);
}
Est-ce que l'erreur est de se plaindre?
OriginalL'auteur Codejoy | 2011-07-08
Vous devez vous connecter pour publier un commentaire.
L'autre
FragmentActivity
'action est l'exécution d'une tâche qui exige laFragment
pour sauver l'état, via un appel àonSaveInstanceState
dans la préparation d'une nouvelle instance d'être reconstruit. Je l'ai vu par exemple quand j'ai été de tirer une activité à partir d'un fragment qui a rempli tout l'écran comme cela a abouti à la vue étant détaché du fragment, de l'état, qui ont besoin d'être sauvés, etc.Vous fondamentalement ne peut pas appeler
commit
entreonSaveInstanceState
et la nouvelle instance du fragment de recréation. Voir s'engager.Comme pour la solution, puis re-penser et essayez d'éviter les
commit
être appelé lorsqu'il est, ou vous pouvez aussi appeler lecommitAllowingStateLoss
si vous pensez que c'est OK pour l'INTERFACE utilisateur de changer de façon inattendue sur l'utilisateur.J'ai utilisé commitAllowingStateLoss, Mais affiche la boîte de dialogue d'alerte, tandis que les changements d'orientation de causes.
OriginalL'auteur PJL
Je pense que la réponse est de ne pas faire de fragment de transactions dans le onActivityResult. Je crois que ce qui se passe est que lorsque le onActivityResult est appelé à l'activité, il n'a pas encore repris et relancé ses fragments.
Utiliser un gestionnaire de publier l'appel à la fonction de l'activité.
travaillé. je ne sais pas combien de un hack, mais cela a fonctionné. +1
Vous demandez-vous à ce travail, si votre application est en arrière-plan, et demeure dans le fond, quand onActivityResult est appelé?
OriginalL'auteur Shinyosan
vous pouvez faire une autre chose qui n'très bon, mais il fonctionne.
OriginalL'auteur douarbou