Comment obtenir le point de vue d'un Fragment à l'extérieur de OnCreateView()
J'ai un Fragment
avec un TableLayout
. Les données de la table à partir d'un db SQLite. La db SQLite est rempli à partir d'un service web RESTful dans un AsyncTask
dans le MainActivity
. Le Fragment
doit attendre que la tâche à effectuer avant le remplissage de la table. Le Fragment
est à l'écoute de la tâche onPostExecute()
méthode à appeler. Lorsqu'elle l'est, la méthode onLoadAndStoreComplete()
dans le Fragment
est appelé. Tout cela fonctionne.
J'ai besoin d'obtenir une vue d'un TableLayout
à l'extérieur de la OnCreateView()
méthode d'un Fragment. Si je pouvais obtenir le point de Vue du fragment dans onLoadAndStoreComplete
qui allait m'amener là.
Même code que voici.
J'ai mContext
de la MainActivity, mais qui n'a pas de getView()
méthode associée.
J'ai essayé:
- un membre de la classe rootView et l'affectation dans onCreateView(), mais dans onLoadAndStoreComplete()
, il est nul.
- un membre de la classe tableLayout et l'affectation dans onCreateView(), mais dans onLoadAndStoreComplete()
, il est nul.
- l'appel de cette.getView() de nouveau dans onLoadAndStoreComplete()
, mais elle renvoie null.
- en appelant le système de gonflage à l'intérieur de onLoadAndStoreComplete()
, qui fonctionne bien, mais alors je ne sais pas quoi utiliser pour le récipient dans le .inflate()
appel
Je ne comprends pas pourquoi le membre de la classe des valeurs de rootView et tableLayout sont nulles dans onLoadAndStoreComplete()
public class MyFragment extends Fragment implements OnLoadAndStoreCompleteListener {
private TableLayout tableLayout;
private View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContext = this.getActivity();
rootView = inflater.inflate(R.layout.fragment_permits, container, false); //this works
tableLayout = (TableLayout) rootView.findViewById(R.id.main_table); //and this
...
}
@Override
public void onLoadAndStoreComplete() {
//rootView is null, ie not remembered from OnCreateView
View view = getView(); //null
LayoutInflater inflater = LayoutInflater.from(getActivity());
rootView = inflater.inflate(R.layout.fragment_permits, container, false); //container? don't know what it should be
//tableLayout is null
tableLayout.addView(tableRow, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
...
}
OnLoadAndStoreCompleteListener
et quand on l'appelle? Ne peut pas trouver dans l'API AndroidJamais entendu parler de
onLoadAndStoreComplete()
êtes-vous sûr d'en respectant le cycle de vie de la Fragment
? Si vous serait alors getView()
ne serait pas de retour null
...Essaye également d'accéder à une
View
à partir d'un Fragment
à l'extérieur de ladite Fragment
est vraiment mauvaise conception... je vous suggère de repenser ce que vous voulez faire et d'essayer d'une manière plus abstraite de la solution.Si vous regardez à la question précédente je lien, vous comprendrez
onLoadAndStoreCompleteListener()
. Je ne cherche pas à accéder à la Vue à l'extérieur du Fragment, mais plutôt, à l'extérieur de OnCreateView()
Votre question doit contenir toutes les informations nécessaires pour y répondre. Vous ne pouvez pas lier à une autre question qui explique le code de cette question.
OriginalL'auteur Al Lelopath | 2015-04-13
Vous devez vous connecter pour publier un commentaire.
Si je comprends votre code correctement, il ya quelque chose de mal avec votre code non-respect Fragment du cycle de vie ou un différents Fragment d'une défaillance d'instance.
A. du Cycle de vie des problème
Android-cadre s'attend à ce que le Fragment de créer son point de vue à l'intérieur de
onCreateView()
méthode. Vue devient disponible après cadre des appels à cette méthode.Il est possible que votre code appelé
onLoadAndStoreComplete()
avantonCreateView()
, ce qui a causé le problème.Vous devez extraire une méthode pour le remplissage de réels points de vue avec les données, il est possible d'avoir 2 points d'entrée. Veuillez voir le code ci-dessous:
B. les Différentes défaillance d'instance
Cela peut se produire lorsque vous êtes d'exploitation sur 2 instances différentes d'avant mentionné fragment.
Au premier abord, tout sera dans l'ordre:
onCreateView()
appelé avantonLoadAndStoreComplete()
. Donc les consulter:onCreateView()
est exactement le même objet qui a appeléonLoadAndStoreComplete()
, vous pouvez utiliserSystem.identityHashCode(this)
, l'obtention des valeurs différentes au cours de ces deux méthodes est un mauvais signeSi c'est ce qui se passe, la cause est probablement caché un peu plus loin, et sans code je ne peux pas vous donner des conseils plus précis sur ce point. Comment voulez-vous créer votre fragment? Via XML ou manuellement, puis ajouter via FragmentManager ou via ViewPager?
Fragment
ou un que j'ai créé moi-même. Ceci est incorrect. Il signifie seulement que les méthodes inhertied deFragment
.OriginalL'auteur jskierbi
getView()
donne rootView de Fragment, qui est retourné à partir deonCreatedView()
. Donc, sionLoadAndStoreComplete()
est appelée avantonCreatedView()
est fini (il ne peut pas retourner votre rootView), vous obteneznull
puisqu'il n'y est pas vue encore.J'ai essayé d'appeler
getView()
à l'intérieur deonViewCreated()
qui n'est PAS nulle:getView()
dansonStart()
retourne nullqu'est-ce que onStart()?
C'est une méthode de
Fragment
. Je l'ai ajouté (ie @Override) dans MyFragment comme une expérience.essayez-la à l'intérieur de onViewCreated() qui est appelé après onCreateView()
Je l'ai fait, même chose, j'ai donc ensuite essayé
onStart()
qui est aprèsonViewCreated()
. Même ainsi, j'apprends que cela peut ne pas être la voie à suivre parce que "si vous transmettez des données via des incubateurs ou des constructeurs, ils ne seront pas restaurés et, par conséquent, peut devenir nulle dans certaines circonstances."OriginalL'auteur Jemshit Iskenderov
De votre fragment de code, si les champs
rootView
ettableLayout
sont initialisés après l'appel deonCreateView(..)
, si les deux champs ne sont pas programmés à null après ça, alors ils doivent être non null lorsque vous appelezonLoadAndStoreComplete(..)
.Dit, je pense que vous appelez cette méthode dans une instance différente de votre fragment. La révision de votre code d'activité et vérifiez que vous utilisez la même instance à partir du fragment de tous les temps.
OriginalL'auteur juanhl
Essayez de changer la définition de onLoadAndStoreComplete de prendre une Vue, puis en passant en vue du fragment.
Les Fragments sont pas différents d'activités: l'utilisation
onSaveInstanceState
afin de sauvegarder vos données dans unBundle
. DansonViewCreated
vous pouvez restaurer les données à nouveau.OriginalL'auteur Joshua Byer
Êtes-vous sûr que onLoadAndStoreComplete() est appelée après onCreateView()? La seule raison pour les variables d'instance pour avoir la valeur null est que la méthode qui initialise n'est pas appelée.
Je vous suggère de mettre un appel pour vous Connecter.d dans onAttach, onDetach, onCreate, onCreateView, onStart, onStop,onLoadAndStoreComplete à voir dans quel ordre sont appelés. Après cela, mettez à jour votre question avec la sortie du journal pour voir ce qui pourrait être le problème et probablement que je pourrais vous donner une plus concise réponse.
OriginalL'auteur Adrian
Vous pouvez faire plusieurs corrections :
Si l'async tâche est appelée avant que le fragment est lancé, puis votre rappel onLoadAndStoreComplete peut être appelée avant que le onCreateView (et tous vos points de vue ne sont pas gonflés)
Vous pouvez exécuter l'asyncTask de onCreateView, mais vous devez afficher un loader pour dire à l'utilisateur que l'application est en cours de synchronisation
Vous pouvez également utiliser un listview et pas un tableLayout :
Vous avez besoin de modifier votre tableLayout à un ListView (à l'intérieur de RelativeLayout?)
OriginalL'auteur Apollo