0

我回來了,並帶有一個新問題。所以現在我創建了一個應用程序,當你點擊一個按鈕時,它可以從一個片段切換到另一個片段。在這兩個片段中有2個viewPagers,它們創建了一個自定義數量的按鈕。但問題是,當我從一個片段切換到另一個時,然後切換回來,第一個片段的內容不再存在。我嘗試了很多東西,沒有什麼能幫助我。我希望你能幫助我。提前致謝。ViewPager的內容在更改片段後消失

主要活動:

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

一個具有所述ViewPager 2個片段:

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

最後一個片段上的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好吧,最後我解決了我的問題與你的溶膠ution但現在我有這樣的問題:

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) 

回答

1

膨脹,你需要塗用getChildFragmentManager(另一個片段中的片段),而不是 myContext.getSupportFragmentManager()。

編輯:

使用FragmentStatePagerAdapter如下:

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

} 
在片段

然後,只需添加要在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

它告訴我,我不能因爲我使用android.support.v4.app.FragmentManager(使用ViewPager),你知道如何解決它嗎? –

+1

看我的編輯!希望它可以幫助你! –

+0

請讓我知道它是否適合您,如果有,請記住標記答案是正確的! –