11
votes

commettre un fragment de la réduction de la charge dans l'activité

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 xxx

j'ai essayé de commettre le fragment à l'aide de xxx

dans le charrevinement et donne une exception illegalStateException disant xxx

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é.

Peut-être de l'aide Moi avec ceci que je peux le réparer sans appeler le chargeur du fragment!


3 Réponses :


8
votes

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>

https://developer.android.com/reference/andrroid/app/froaderermanager.loadercallbacks.html#onloadfinished (android.content.loader, d) p>

(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);
     } 


2 commentaires

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 ...



14
votes

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. xxx pré>

dans le gestionnaire, p> xxx pré>

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.


5 commentaires

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 'S Afficher () méthode et remplacez l'appel à commit () avec StationallStateloss () .


Le gestionnaire est la voie à suivre



0
votes

Comme @kwazi répondit, il s'agit d'une mauvaise expérience utilisateur d'appeler fragmenttransition.commit () code> à partir de Onloadfinished () code>. J'ai trouvé une solution pour cet événement à l'aide de ProgressDialog.

première créée 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>

p>

"FAUX">
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;
		}
	}


0 commentaires