0

Ich bin hier mit einer neuen Frage zurück. Im Moment habe ich eine App erstellt, die von einem Fragment in ein anderes Fragment wechseln kann, wenn Sie auf eine Schaltfläche klicken. Und in diesen 2 Fragmenten befinden sich 2 viewPager, die eine eigene Anzahl an Buttons erstellen. Aber das Problem ist, dass, wenn ich von einem Fragment auf das andere umschalte und ich dann zurückwechsle, der Inhalt des ersten nicht mehr da ist. Ich habe viele Dinge ausprobiert und nichts hilft mir wirklich. Und ich hoffe, du kannst mir helfen. Danke im Voraus.Inhalt von ViewPager verschwindet nach dem Ändern der Fragmente

Die Hauptaktivität:

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

Einer der 2-Fragmente, die die ViewPager haben:

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

Und schließlich ein Fragment auf dem viewPager angezeigt:

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 endlich habe ich mein Problem mit deinem Sol gelöst ution aber jetzt habe ich dieses Problem:

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) 

Antwort

1

Um Fragmente in einem anderen Fragment aufblasen Sie tu getChildFragmentManager() anstelle von myContext.getSupportFragmentManager() verwenden müssen.

EDIT:

Verwenden FragmentStatePagerAdapter wie folgt:

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

} 

Dann einfach in Ihrem Fragment der Fragmente fügen Sie in der viewPager zeigen wollen:

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

Es sagt mir, dass Ich kann nicht, weil ich android.support.v4.app.FragmentManager verwende (um ViewPager zu verwenden), weißt du, wie man es repariert? –

+1

Siehe meine Bearbeitung! Hoffe es hilft dir! –

+0

Bitte lassen Sie es mich wissen, wenn es für Sie funktioniert, und wenn ja, denken Sie daran, die Antwort als richtig zu markieren! –

Verwandte Themen