J'ai une activité qui charge une liste de données du serveur à l'aide de rappels Loader. Je dois énumérer les données dans un fragment qui s'étend j'ai essayé de commettre le fragment à l'aide de p> dans le charrevinement et donne une exception illegalStateException disant p> J'ai fait référence à l'exemple dans la barre d'action Sherlock, mais ces exemples ont des chargeurs dans les fragments et non l'activité. P> Peut-être de l'aide Moi avec ceci que je peux le réparer sans appeler le chargeur du fragment! p> p>
3 Réponses :
Selon les documents Android sur la méthode de la charrette ():
Notez que Normalement, une application n'est pas autorisée à commettre des transactions de fragment lors de cet appel, car cela peut arriver après l'enregistrement d'une activité d'activité. Voir FragmentManager.Opentransaction () Pour une discussion ultérieure à ce sujet. P> blockquote>
(Remarque: Copier / coller ce lien dans votre navigateur ... Stackoverflow ne manipule pas bien ..) em> p>
Donc, vous ne devez donc jamais charger un fragment dans cet état. Si vous ne voulez vraiment pas mettre le chargeur dans le fragment, vous devez initialiser le fragment dans votre méthode oncreate () de l'activité, puis lorsque onlineFinished se produit, appelez simplement une méthode sur votre fragment. P>
Certains Pseudo Code suit: P>
public class DummyFragment { public void setData(Object someObject) { //do stuff } public class DummyActivity extends LoaderCallbacks<Object> { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fragment newFragment = DummyFragment.newInstance(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.simple_fragment, newFragment).commit(); getSupportLoaderManager.initLoader(0, null, this) } // put your other LoaderCallbacks here... onCreateLoader() and onLoaderReset() public void onLoadFinished(Loader<Object> loader, Object result) { Fragment f = getSupportLoaderManager.findFragmentById(R.id.simple_fragment); f.setData(result); }
Merci pour votre réponse! :) Peut-être que je n'étais pas clair sur ma question. J'ai déjà consacré mon front de maison, je voulais juste mettre en œuvre l'empilement du prochain fragment, sur charger certaines données. J'ai trouvé une méthode d'imitation qui. Je vais le poster comme une réponse. +1 pour votre soutien et votre réponse. Je n'ai vraiment pas pensé à utiliser f.setdata (résultat) que j'aurais pu utiliser dans la même activité dans d'autres fragments. :)
Ah, je n'étais pas au courant. Quoi qu'il en soit, voir mon commentaire sur votre réponse concernant une meilleure solution. Entrée de prisonnierStateloss () serait la voie à suivre ...
Atlast, j'ai trouvé une solution à ce problème. Créez une poignée Définition d'un message vide et appelez ce gestionnaire surchargée (). Le code est similaire à celui-ci. dans le gestionnaire, p> Le nombre de fragments dépend de l'exigence. P> This method can be mainly used in case of stackFragments, where all fragments have different related functions.
Hmm je conseillerais contre cela. Si vous avez vraiment besoin d'empiler des fragments comme vous le dites, vous pouvez simplement appeler COMMONDALLOWSTATELOSS (). Cela évitera le gestionnaire et l'illegalargumentException comme vous raconteriez la plate-forme. »C'est bon, je suis au courant des risques. Faites-le de toute façon». Voir Link
Merci Kwazi, j'avais essayé cette méthode. Merci de votre aide. C'était un bon conseil. À votre santé :)
Juste une note: appeler le commaloalleurStateloss n'est pas une option lors de l'appel de dialoguefragment.show (). J'ai dû utiliser un gestionnaire pour ce type de transaction de fragment particulier.
@ JavaHead76 Ou vous pouvez remplacer la boîte de dialogue code> code> 'S Afficher () code> méthode et remplacez l'appel à
commit () code> avec
StationallStateloss () code>.
Le gestionnaire est la voie à suivre
Comme @kwazi répondit, il s'agit d'une mauvaise expérience utilisateur d'appeler première créée p> fragmenttransition.commit () code> à partir de
Onloadfinished () code>. J'ai trouvé une solution pour cet événement à l'aide de ProgressDialog.
progresssialog.sedictondismisslistener (nouvel écouteur) code> pour regarder le
Onloadfinished (). Code>
De plus, je fais
progressdialog.show () code> avant
getchargermanager (). RedArtArtRer () code>.
Et éventuellement place
progresssialog.dismiss () code> dans
Onloadfinished () code>.
Une telle approche permettent de ne pas lier le fil principal de l'interface utilisateur et du filetage du chargeur. P>
public class FrPersonsListAnswer extends Fragment
implements
LoaderCallbacks<Cursor>{
private ProgressDialog progressDialog;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_persons_list, container, false);
//prepare progress Dialog
progressDialog = new ProgressDialog(curActivity);
progressDialog.setMessage("Wait...");
progressDialog.setIndeterminate(true);
progressDialog.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
//make FragmentTransaction.commit() here;
//but it's recommended to pass control to your Activity
//via an Interface and manage fragments there.
}
});
lv = (ListView) view.findViewById(R.id.lv_out1);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,
final int position, long id) {
//START PROGRESS DIALOG HERE
progressDialog.show();
Cursor c = (Cursor) parent.getAdapter().getItem(position);
// create Loader
getLoaderManager().restartLoader(1, null, curFragment);
}
});
return view;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
switch (loader.getId()) {
case 1:
//dismiss dialog and call progressDialog.onDismiss() listener
progressDialog.dismiss();
break;
default:
break;
}
}
Dupliqué possible de Android - Problèmes utilisant la fragmentationCittivité + chargeur pour mettre à jour FragmentStatePagerAdapter a >