2017-04-14 3 views
0

J'ai un tabLayout avec un viewpager avec 5 fragment, je ne sais pas pourquoi mais dans le cinquième fragment quand j'utilise getActivity() même après onActivityCreated il renvoie null, quand dans les autres fragments Je l'utilise dans onCreateView et ça marche bien.Fragment getActivity est null après onActivityCreated avec viewPager

Mon cinquième fragment:

public class SettingsFragment extends Fragment { 

private static final String ARG_SECTION_NUMBER = "section_number"; 
private TextView name,losed_bg,winned_bg,played_bg; 
private DatabaseReference mdatabase; 
private FirebaseAuth mAuth; 
private CircleImageView userpic; 
private static final int CAMERA=0,GALLERY=1; 
private Typeface font; 
private Button logout; 
private ProgressBar loading; 
private ImageView edit_image; 
private EditText edit_text; 
private AlertDialog.Builder getImageFrom; 

public SettingsFragment() { 
} 

public static SettingsFragment newInstance(int sectionNumber) { 
    SettingsFragment fragment = new SettingsFragment(); 
    Bundle args = new Bundle(); 
    args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    mdatabase= FirebaseDatabase.getInstance().getReference().child("USERS").child(mAuth.getCurrentUser().getUid()); 

    mdatabase.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      name.setText(dataSnapshot.child("name").getValue(String.class)); 

      if(dataSnapshot.hasChild("losed")){ 

        //CRASH String spannable = getActivity().getString(R.string.settings_losed)+" "+String.valueOf(dataSnapshot.child("losed").getValue(Integer.class)); 
        losed_bg.setText(spannable); 
      } 
      else{ 

        String spannable =getActivity().getString(R.string.settings_losed)+" "+String.valueOf(0); 
        losed_bg.setText(spannable); 

      } 

      if(dataSnapshot.hasChild("winned")){ 
        String spannable = getActivity().getString(R.string.settings_winned)+" "+String.valueOf(dataSnapshot.child("winned").getValue(Integer.class)); 
        winned_bg.setText(spannable); 

      } 
      else{ 
        String spannable = getActivity().getString(R.string.settings_winned) + " " + String.valueOf(0); 
        winned_bg.setText(spannable); 

      } 

      if(dataSnapshot.hasChild("played")){ 
        String spannable = getActivity().getString(R.string.settings_played) + " " + String.valueOf(dataSnapshot.child("played").getValue(Integer.class)); 
        played_bg.setText(spannable); 

      } 
      else{ 
        String spannable = getActivity().getString(R.string.settings_played) + " " + String.valueOf(0); 
        played_bg.setText(spannable); 

      } 
      if(dataSnapshot.child("profile_pic").getValue(String.class)!=null) { 

       getImage(); 
      } 
      else{ 
       loading.setVisibility(View.INVISIBLE); 
       userpic.setVisibility(View.VISIBLE); 
       userpic.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         getImageFrom.show(); 

        } 
       }); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

}

Je reçois

java.lang.IllegalStateException: Fragment SettingsFragment{3ee8ade} not attached to Activity 

Et l'activité où je mis en place le tabLayout

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     // getItem is called to instantiate the fragment for the given page. 
     // Return a PlaceholderFragment (defined as a static inner class below). 
     switch (position){ 
      case 0: 
       return MainFragment.newInstance(0); 
      case 1: 
       return GamesFragment.newInstance(0); 
      case 2: 
       return OfflineFragment.newInstance(0); 
      case 3: 
       return FactoryFragment.newInstance(0); 
      case 4: 
       return SettingsFragment.newInstance(0); 
     } 

     return MainFragment.newInstance(position + 1); 
    } 

    @Override 
    public int getCount() { 

     return 5; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 

     return null; 
    } 
} 

mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
       // Set up the ViewPager with the sections adapter. 
       mViewPager = (ViewPager) findViewById(R.id.container); 
       mViewPager.setAdapter(mSectionsPagerAdapter); 
       tabLayout = (TabLayout) findViewById(R.id.tabs); 
       tabLayout.setupWithViewPager(mViewPager); 

       for (int i = 0; i < tabLayout.getTabCount(); i++) { 
        switch (i){ 
         case 0: 
          View view1 = getLayoutInflater().inflate(R.layout.tab_icon_view, null); 
          view1.findViewById(R.id.icon).setBackgroundResource(R.drawable.ic_home_white_48dp); 
          tabLayout.getTabAt(i).setCustomView(view1); 
          break; 
         case 3: 
          View view2 = getLayoutInflater().inflate(R.layout.tab_icon_view, null); 
          view2.findViewById(R.id.icon).setBackgroundResource(R.drawable.factory); 
          tabLayout.getTabAt(i).setCustomView(view2); 
          break; 
         case 1: 
          View view3 = getLayoutInflater().inflate(R.layout.tab_icon_view, null); 
          view3.findViewById(R.id.icon).setBackgroundResource(R.drawable.games_icon); 
          tabLayout.getTabAt(i).setCustomView(view3); 
          break; 
         case 2: 
          View view5 = getLayoutInflater().inflate(R.layout.tab_icon_view, null); 
          view5.findViewById(R.id.icon).setBackgroundResource(R.drawable.nointernet); 
          tabLayout.getTabAt(i).setCustomView(view5); 
          break; 
         case 4: 
          View view4 = getLayoutInflater().inflate(R.layout.tab_icon_view, null); 
          view4.findViewById(R.id.icon).setBackgroundResource(R.drawable.ic_account_circle_white_48dp); 
          tabLayout.getTabAt(i).setCustomView(view4); 
          break; 

        } 

       } 
+0

quelle ligne provoque le NPE? –

+0

Le premier qui obtient la chaîne avec getActivity –

+0

Modifiez this- return MainFragment.newInstance (position + 1); à this- return MainFragment.newInstance (position); –

Répondre

0

Déplacer le code ajoute la liste de la base de données (addValueEventListener) à la méthode OnAttach du fragment. Selon la façon dont vous utilisez ViewPager, FragmentPagerAdapter pourrait décider de «recycler» vos fragments. Il est donc important de supprimer l'écouteur de la base de données lorsque le fragment est détaché de l'activité (OnDetach).

On dirait que la base de données est un singleton, de sorte que l'écouteur peut dépasser votre fragment ou même l'activité. Peut-être causer des fuites de mémoire. Alors n'oubliez pas d'enlever l'auditeur juste pour être sûr.

+0

Merci, le problème était le ValueEventListener, j'ai essayé avant de surcharger onAttach mais cela n'a pas fonctionné parce que je n'ai pas utilisé addListenerForSingleValueEvent. –