0

Je suis de retour ici avec une nouvelle question. Donc, au moment où j'ai créé une application, qui peut passer d'un fragment à un autre fragment lorsque vous cliquez sur un bouton. Et à l'intérieur de ces 2 fragments, il y a 2 viewPagers, qui créent un nombre de boutons personnalisé. Mais le problème est que lorsque je passe d'un fragment à l'autre, puis que je me déconnecte, le contenu du premier n'est plus là. J'ai essayé beaucoup de choses et rien ne m'a vraiment aidé. Et j'espère que tu peux m'aider. Merci d'avance.Contenu de ViewPager disparaître après avoir changé de fragments

L'activité principale:

public class MainActivity extends AppCompatActivity { 

    String identifiant=null; 
    BottomBar bottombar; 
    ProgressBar progressBar; 
    ImageButton imageButton; 
    TextView nomson; 
    RelativeLayout aaaa; 
    FragmentWhizz fragmentWhizz; 
    FragmentPlaylist fragmentPlaylist; 

    FragmentManager fm; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     autorisation(); 


     fragmentWhizz = new FragmentWhizz(); 
     fragmentPlaylist=new FragmentPlaylist(); 

     Fragment fragment = new FragmentConnexion(); 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction transaction = fm.beginTransaction(); 
     transaction.replace(R.id.contentFragment, fragment); 
     transaction.commit(); 

     bottombar = (BottomBar) findViewById(bottomBar); 

     aaaa = (RelativeLayout) findViewById(R.id.aaaa); 


     bottombar.setVisibility(View.INVISIBLE); 
     bottombar.setOnTabSelectListener(new OnTabSelectListener() { 
      @Override 
      public void onTabSelected(@IdRes int tabId) { 
       if (tabId == R.id.tab_whiz) { 
        if(identifiant !=null){ 
         changementFragment(fragmentWhizz); 
        } 
       } 
       if (tabId == R.id.tab_playlist) { 
        if(identifiant !=null){ 
         changementFragment(fragmentPlaylist); 
        } 
       } 
       if (tabId == R.id.tab_reveil) { 
        if(identifiant !=null){ 
         changementFragment(new FragmentReveil()); 
        } 
       } 
       if (tabId == R.id.tab_param) { 
        if(identifiant !=null){ 
         changementFragment(new FragmentParam()); 
        } 
       } 
      } 
     }); 

    } 
    public void changementFragment(final Fragment fragment){ 
     runOnUiThread(new Runnable() { 
      public void run() { 
       fm = getFragmentManager(); 
       FragmentTransaction ft =fm.beginTransaction(); 
       ft.setCustomAnimations(android.R.animator.fade_in,android.R.animator.fade_out); 
       ft.replace(R.id.contentFragment, fragment).commit(); 
      } 
     }); 
    } 
} 

L'un des 2 fragments qui ont le ViewPager:

public class FragmentPlaylist extends Fragment { 

    SlideToutesPlaylist fragmentAllPlaylist = new SlideToutesPlaylist(); 
    SlideUserPlaylist fragmentUserPlaylist = new SlideUserPlaylist(); 
    ViewPager mViewPager; 
    FloatingActionButton floatbutton; 
    private FragmentActivity myContext; 

    @Override 
    public void onAttach(Activity activity) { 
     myContext=(FragmentActivity) activity; 
     super.onAttach(activity); 
    } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View myView = inflater.inflate(R.layout.playlist, container, false); 
     DeplacerBoutton deplacer = new DeplacerBoutton(getActivity(),2); 
     floatbutton = (FloatingActionButton) myView.findViewById(R.id.floatingActionButton); 
     floatbutton.setOnTouchListener(deplacer); 
     mViewPager = (ViewPager) myView.findViewById(R.id.slide); 
     mViewPager.setAdapter(new SamplePagerAdapter(myContext.getSupportFragmentManager())); 
     Log.i("test","test"); 
     return myView; 
    } 


    public class SamplePagerAdapter extends FragmentStatePagerAdapter { 

     SamplePagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public android.support.v4.app.Fragment getItem(int position) { 
      /** Show a Fragment based on the position of the current screen */ 
      if (position == 0) { 
       return fragmentAllPlaylist; 
      } else 
       return fragmentUserPlaylist; 
     } 

     @Override 
     public int getCount() { 
      // Show 2 total pages. 
      return 2; 
     } 
    } 
} 

Et enfin un fragment affiché sur le viewPager:

public class SlideToutesPlaylist extends Fragment { 


    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View myView = inflater.inflate(R.layout.playlistall, container, false); 
     AffichePlaylist(myView); 
     return myView; 
    } 

    public void AffichePlaylist(View myView){ 
     ExecHttpGetRequest requete = new ExecHttpGetRequest(); 
     requete.execute("an IP"); 
     LinearLayout aaa = (LinearLayout) myView.findViewById(R.id.aaa); 

     try { 
      if (requete.get() != null) { 
       JSONObject jsonObj = new JSONObject(requete.get()); 
       JSONArray jSon = jsonObj.getJSONArray("valeurs"); 
       for (int i = 0; i < jSon.length(); i++) { 
        JSONObject c = jSon.getJSONObject(i); 
        final String nom_playlist = c.getString("nom_playlist"); 
        final String id_playlist = c.getString("id_playlist"); 
        final String id_createur = c.getString("id_createur"); 
        final String nb_vote = c.getString("nb_vote"); 
        Button bouton = new Button(getContext()); 
        bouton.setText(nom_playlist); 
        aaa.addView(bouton); 

       } 
      } 
     } catch (InterruptedException | ExecutionException | JSONException e) { 
      e.printStackTrace(); 
     } 


    } 
} 

EDIT Ok, enfin, j'ai résolu mon problème avec votre sol ution mais maintenant j'ai ce problème:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 
        at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:873) 
        at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215) 
        at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1481) 
        at android.view.View.dispatchRestoreInstanceState(View.java:14762) 
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3123) 
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3129) 
        at android.view.View.restoreHierarchyState(View.java:14740) 
        at android.support.v4.app.Fragment.restoreViewState(Fragment.java:475) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1329) 
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757) 
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355) 
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146) 
        at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098) 
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008) 
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710) 
        at android.os.Handler.handleCallback(Handler.java:746) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5443) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

Répondre

1

Pour gonfler des fragments à l'intérieur un autre fragment dont vous avez besoin d'utiliser tu getChildFragmentManager() au lieu de myContext.getSupportFragmentManager().

EDIT:

Utilisation FragmentStatePagerAdapter comme suit:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 

import java.util.ArrayList; 
import java.util.List; 

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

private List<Fragment> mFragmentList = new ArrayList<>(); 
private List<String> mFragmentTitleList = new ArrayList<>(); 


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

@Override 
public Fragment getItem(int position) { 
    return mFragmentList.get(position); 
} 

//Check if the list is empty before return the size 
@Override 
public int getCount() { 
    return mFragmentList != null ? mFragmentList.size() : 0; 
} 


public void addFragment(Fragment fragment, String title) { 
    mFragmentList.add(fragment); 
    mFragmentTitleList.add(title); 
} 

public void addFragment(Fragment fragment) { 
    mFragmentList.add(fragment); 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    if (!mFragmentTitleList.isEmpty()) { 
     return mFragmentTitleList.get(position); 
    } 
    return ""; 
} 

} 

Ensuite, dans votre fragment juste ajouter les fragments que vous voulez afficher dans le viewPager:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.annotation.Nullable; 
import android.support.design.widget.TabLayout; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

... 

viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
adapter = new ViewPagerAdapter(getChildFragmentManager()); 
adapter.addFragment(SlideToutesPlaylist.newInstance(), getString(R.string.title)); 
adapter.addFragment(SlideToutesPlaylist.newInstance(), getString(R.string.title)); 
viewPager.setAdapter(adapter); 
viewPager.setOffscreenPageLimit(2); 
+0

Il me dit que Je ne peux pas parce que j'utilise android.support.v4.app.FragmentManager (pour utiliser ViewPager), savez-vous comment le réparer? –

+1

Voir mon édition! J'espère que cela vous aide! –

+0

S'il vous plaît laissez-moi savoir si cela fonctionne pour vous, et si c'est le cas, n'oubliez pas de marquer la réponse comme correcte! –