Exception De Pointeur Null Dans Les Fragments
Je suis NullPointerException lors du lancement d'Un Fragment De Fragment d'autres. Je suis en train d'appeler une méthode dans le deuxième Fragment après le Démarrage du Fragment de façon dynamique.
Voici mon logcat:
05-20 09:58:31.907: E/AndroidRuntime(2585): FATAL EXCEPTION: main
05-20 09:58:31.907: E/AndroidRuntime(2585): java.lang.NullPointerException
05-20 09:58:31.907: E/AndroidRuntime(2585): at com.exercise.FragmentTest.MyFragment3.setImage(MyFragment3.java:22)
05-20 09:58:31.907: E/AndroidRuntime(2585): at com.exercise.FragmentTest.FragmentTestActivity$1.onClick(FragmentTestActivity.java:48)
05-20 09:58:31.907: E/AndroidRuntime(2585): at android.view.View.performClick(View.java:4204)
05-20 09:58:31.907: E/AndroidRuntime(2585): at android.view.View$PerformClick.run(View.java:17355)
05-20 09:58:31.907: E/AndroidRuntime(2585): at android.os.Handler.handleCallback(Handler.java:725)
05-20 09:58:31.907: E/AndroidRuntime(2585): at android.os.Handler.dispatchMessage(Handler.java:92)
05-20 09:58:31.907: E/AndroidRuntime(2585): at android.os.Looper.loop(Looper.java:137)
05-20 09:58:31.907: E/AndroidRuntime(2585): at android.app.ActivityThread.main(ActivityThread.java:5041)
05-20 09:58:31.907: E/AndroidRuntime(2585): at java.lang.reflect.Method.invokeNative(Native Method)
05-20 09:58:31.907: E/AndroidRuntime(2585): at java.lang.reflect.Method.invoke(Method.java:511)
05-20 09:58:31.907: E/AndroidRuntime(2585): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-20 09:58:31.907: E/AndroidRuntime(2585): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-20 09:58:31.907: E/AndroidRuntime(2585): at dalvik.system.NativeStart.main(Native Method)
Et Mon Activité Principale code:
public class FragmentTestActivity extends FragmentActivity{
Fragment fragment;
Button btnFragment1, btnFragment2, btnFragment3;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnFragment1 = (Button)findViewById(R.id.displayfragment1);
btnFragment2 = (Button)findViewById(R.id.displayfragment2);
btnFragment3 = (Button)findViewById(R.id.displayfragment3);
//get an instance of FragmentTransaction from your Activity
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//add a fragment
MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.myfragment, myFragment);
fragmentTransaction.commit();
btnFragment1.setOnClickListener(btnFragmentOnClickListener);
btnFragment2.setOnClickListener(btnFragmentOnClickListener);
btnFragment3.setOnClickListener(btnFragmentOnClickListener);
}
Button.OnClickListener btnFragmentOnClickListener
= new Button.OnClickListener(){
@Override
public void onClick(View v) {
if(v == btnFragment3){
MyFragment3 newfragment = new MyFragment3();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//Replace whatever is in the fragment_container view with this fragment,
//and add the transaction to the back stack
transaction.replace(R.id.myfragment, newfragment);
transaction.addToBackStack(null);
//Commit the transaction
transaction.commit();
newfragment.setImage();
return;
}
//TODO Auto-generated method stub
Fragment newFragment = null;
//Create new fragment
if(v == btnFragment1){
newFragment = new MyFragment();
}
else if(v == btnFragment2){
newFragment = new MyFragment2();
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//Replace whatever is in the fragment_container view with this fragment,
//and add the transaction to the back stack
transaction.replace(R.id.myfragment, newFragment);
transaction.addToBackStack(null);
//Commit the transaction
transaction.commit();
//Create new transaction
}};
}
Et Mon Fragment3 classe est:
public class MyFragment3 extends Fragment {
ImageView iv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//TODO Auto-generated method stub
View myFragmentView = inflater.inflate(R.layout.fragmentlayout3, container, false);
iv = (ImageView)myFragmentView.findViewById(R.id.image);
return myFragmentView;
}
public void setImage(){
iv.setImageResource(R.drawable.penguins);
}
}
Merci de m'aider à surmonter ce problème.
est R. id.image déclarée à l'intérieur d'fragmentlayout3 ?
oui, j'ai besoin d'afficher la dynamique de l'image dans le fragment basé sur l'Activité Principale, cliquez sur le bouton..
oui, j'ai besoin d'afficher la dynamique de l'image dans le fragment basé sur l'Activité Principale, cliquez sur le bouton..
OriginalL'auteur wolverine | 2013-05-20
Vous devez vous connecter pour publier un commentaire.
votre erreur est ce qui se passe ici:
et cela se passe parce que la variable
iv
est encorenull
.vous devez attendre jusqu'à ce que après le Fragment est indiqué (gonflé) afin d'accéder à des points de Vue qui ont été gonflés.
pour en savoir plus, essayez de lire à propos de la Fragment du cycle de vie.
un très bon moyen de la création de ce sera à l'aide de la
setArgs
méthode et le passage d'unBundle
avec les informations sur votre image.essayez d'utiliser ce code:
allez sur le lien ci-joint, vous pouvez voir exactement ce que la méthode est appelée, et quand. vous ne pouvez pas définir les images à null, et la Vue n'est pas créé jusqu'
onCreateView
est appeléde l'avis de ma mise à jour
ouais.. Merci.. Il fonctionne parfaitement si j'ai moins le nombre de vues. Mais dans mon cas, j'ai l'utilisation de plus de 10 points de vue qui sont basées sur le Fragment Précédent
vous de la canne à créer une classe d'aide pour prendre soin de cela. croyez-moi, ce est la bonne façon de procéder, il a été conçu comme ça, et tous les Android exemples de projets sont construits comme ça.
OriginalL'auteur thepoosh
Vous essayez d'accéder à imageview qui sera créée dans onCreateView du fragment. Lorsque vous appelez
newfragment.setImage();
votre point de vue n'est pas encore créé d'où vous êtes l'obtention d'un NPE.essayez d'utiliser
setArgs
pour transmettre ce type d'information pour le fragmentquels paramètres peut je passe les arguments? comme, j'ai 10 nombre de vues d'images, Textviews.. Donc je pense que setArgs n'est pas l'alternative
Bundle args = new Bundle(); args.putInt("image", i); newfragment.setArguments(args);
Dans MyFragment3 vous pouvez appelergetArguments().getInt("image", 0);
pour obtenir la valeur passée à la fragment.OriginalL'auteur Tarun
Vous ne pouvez pas le faire de cette façon parce que onCreateView n'a pas été appelée pourtant si votre
iv
est null.Vous pouvez mettre
iv.setImageResource(R.drawable.penguins);
dans leonCreateView()
ou peut-être dansonAttach()
(je ne suis pas sûr à propos de la seconde).Vous pouvez passer un booléen que les arguments qui seront en indiquant ce que vous voulez charger. Par exemple, vous pouvez passer bundle avec isSetImage booléen et dans onCreateView() en fonction de ce drapeau, vous pouvez définir votre image ou pas.
c'est très bien.. Mais j'ai plus de 10 avis que contrôlé par la principale Activité. Et j'ai quelques ArrayLists. Je suis nouveau sur Fragments, peut-u s'il vous plaît m'aider avec un exemple.
marakana.com/s/post/1250/android_fragments_tutorial lire cet article, il devrait vous aider à comprendre les fragments.
J'ai lu ce Document.. Dans ce qu'il fait seulement fixer les fragments, en remplacement.. Dans Mon cas, c'est de travailler.. Mais le problème est que lorsque j'essaie d'appeler une méthode à partir de Fragment Précédent.
OriginalL'auteur Michał Z.
Utiliser getActivity.findViewById dans le Fragment
OriginalL'auteur Narendra Yadav
Dans mon cas, le problème était que j'ai essayé d'utiliser le
SwipeRefreshLayout
comme l'élément racine du fragment de la mise en page XML. Une fois, j'ai ajouté laSwipeRefreshLayout
comme un enfant de laConstraintLayout
utilisé par le fragment, il a commencé à travailler.OriginalL'auteur Gus