0

私はここに新しい質問で戻っています。ですから、アプリケーションを作成した時点で、ボタンをクリックするとフラグメントから別のフラグメントに切り替えることができます。これらの2つのフラグメントの中には2つのviewPagersがあり、カスタムのボタン数を作成します。しかし、問題は、フラグメントから別のフラグメントに切り替えた後、私が元に戻ったときに、最初のものの内容がもう存在しないことです。私はたくさんのことを試みましたが、何も本当に私を助けません。あなたが私を助けてくれることを願っています。前もって感謝します。フラグメントを変更した後の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; 
     } 
    } 
} 

そして最後にviewPagerに表示された1つの断片:

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 ViewPagerを持つ2つのフラグメントの

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

ワン最後に、私はあなたのゾルで私の問題を解決した

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

あなたはTUはgetChildFragmentManagerを(使う必要がある別のフラグメントの内部フラグメントを膨らませるために)の代わりに、 myContext.getSupportFragmentManager():utionが、今私はこの問題を抱えています。

EDIT:

使用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

それは私に語りましたViewPagerを使用するためにandroid.support.v4.app.FragmentManagerを使用しているため、私はできません。あなたはそれを修正する方法を知っていますか? –

+1

私の編集を参照してください!それがあなたを助けることを願って! –

+0

あなたには効果があるかどうか教えてください。そうであれば、答えを正しいものとして記入してください。 –

関連する問題