7

Ho letto diversi post (http://tinyurl.com/pb8es74, http://tinyurl.com/p9pcfcv...) Ma non riesco a trovare una soluzione.Frammenti all'interno di ViewPager scompaiono quando cambia l'orientamento

Ho un MainActivity che carica un layout contenente un ViewPager con tre frammenti (che hanno layout diversi a seconda dell'orientamento).

Ho aggiunto questa funzione per l'attività in modo che non viene distrutta quando cambia l'orientamento come potrebbe avere alcune finestre o popips aperto:

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|uiMode" 

Pertanto, ho sovrascritto il metodo "onConfigurationChanged" che ha appena chiama il metodo loadLayout, in cui si fa tutto ciò che riguarda la vista:

private void loadLayout() { 
    setContentView(R.layout.layout_main_activity); 

    pager = (ViewPager) this.findViewById(R.id.pager); 
    pager.setPageTransformer(true, new DepthPageTransformer()); 

    adapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(Fragment1.getInstance()); 
    adapter.addFragment(Fragment2.getInstance()); 
    adapter.addFragment(Fragment3.getInstance()); 

    pager.setAdapter(adapter); 
    pager.setOffscreenPageLimit(2); 

    //Media controllers 
    imgMediaController= (ImageButton) findViewById(R.id.media_controller); 

    imgMediaController.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      [...] 
     } 
    }); 

    imgVolumeController= (ImageButton) findViewById(R.id.volume_controller); 
    gM.setImgVolumeController(imgVolumeController); 

    imgVolumeController.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      [...] 
     } 
    }); 
} 

il codice dei frammenti è uguale:

public class FragmentNature extends Fragment { 

private static FragmentNature instance; 
private SoundManager sM; 
private View rootView; 
Hashtable<String, ImageButton> h_Images; 
private Handler repeatUpdateHandler = new Handler(); 
private Toast volumeToast; 


public static FragmentNature getInstance() { 
    if (instance == null) 
     instance = new FragmentNature(); 
    return instance; 
} 

public void nullInstance() { 
    instance=null; 
} 

public FragmentNature(){ 
    h_Images=new Hashtable<String,ImageButton>(); 
} 

public void onCreate(Bundle savedInstanceState) { 
    Log.d("Naturing", "On create->Estoy en el fragment nature"); 
    super.onActivityCreated(savedInstanceState); 
    sM=SoundManager.getInstance(); 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 


    rootView=null; 
    Log.d("Naturing", "On createView->Estoy en el fragment nature"); 
    rootView = inflater.inflate(R.layout.fragment_nature, container, false); 

    final ImageButton imgRain= (ImageButton) rootView.findViewById(R.id.n_rain); 
    h_Images.put("n_rain",imgRain); 
    imgRain.setImageResource(R.drawable.n_rainsel); 

    final ImageButton imgRiver= (ImageButton) rootView.findViewById(R.id.n_river); 
    imgRiver.setImageResource(R.drawable.n_riversel); 

    final ImageButton imgWave= (ImageButton) rootView.findViewById(R.id.n_wave); 
    h_Images.put("n_wave",imgWave); 
    imgWave.setImageResource(R.drawable.n_wavesel); 

    final ImageButton imgWind= (ImageButton) rootView.findViewById(R.id.n_wind); 
    h_Images.put("n_wind", imgWind); 
    imgWind.setImageResource(R.drawable.n_windsel); 

    final ImageButton imgFire= (ImageButton) rootView.findViewById(R.id.n_fire); 
    h_Images.put("n_fire", imgFire); 
    imgFire.setImageResource(R.drawable.n_firesel); 

    final ImageButton imgTree= (ImageButton) rootView.findViewById(R.id.n_tree); 
    h_Images.put("n_tree", imgTree); 
    imgTree.setImageResource(R.drawable.n_treesel); 

    final ImageButton imgStorm= (ImageButton) rootView.findViewById(R.id.n_storm); 
    h_Images.put("n_storm", imgStorm); 
    imgStorm.setImageResource(R.drawable.n_stormsel); 

    final ImageButton imgDrop= (ImageButton) rootView.findViewById(R.id.n_drop); 
    h_Images.put("n_drop", imgDrop); 
    imgDrop.setImageResource(R.drawable.n_dropsel); 

    final ImageButton imgDeepSea= (ImageButton) rootView.findViewById(R.id.n_deepsea); 
    h_Images.put("n_deepsea", imgDeepSea); 
    imgDeepSea.setImageResource(R.drawable.n_deepseasel); 

    return rootView; 
} 

private boolean isNetworkAvailable(){ 
    Context context=ApplicationManager.getAppContext(); 
    ConnectivityManager connectivityManager= 
      (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo= connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 

public void changeImageStatus(String sound, int imgId){ 
    Log.d("Naturing", "FragmentNature::changeImageStatus | sound= " + sound + " imgId=" + imgId); 
    h_Images.get(sound).setImageResource(imgId); 
} 

}

Il problema è che quando cambia l'orientamento, il layout mainActivity sia correttamente caricato, ma il viewPager non è. In effetti scompare e nulla può essere visto al suo posto. Ad ogni modo, il viewPager è lì perché sono in grado di attraversarlo e raggiungere la fine (lo so perché posso vedere il segno blu quando raggiungi la fine di un menu e così).

Ho anche provato a chiamare il metodo OncreateView dei frammenti ma non cambia nulla.

Qualche idea? Grazie e tipo riguarda

EDIT 1

Se prendo "pager.setOffscreenPageLimit (2);", dopo modifiche dell'orientamento, frammento 1 e frammento 3 sono visibili quando scorrere il viewpager per un po ' , ma il frammento 2 non appare in nessun caso. So che non è molto, ma nel caso dà un suggerimento a chiunque.

EDIT 2

Se prendo la linea del Manifesto, funziona bene come si chiama l'onCreateView del MainActivity e Fragment. Ma ho bisogno della linea nel manifest.

+0

Posso sapere il motivo per cui si utilizza 'DepthPAgeTransformer' ... e pubblicare il tuo frammento di codice anche – bGorle

+0

lo uso solo per fare qualche evento speciale durante lo scorrimento del cercapersone. L'ho rimosso, ma ho ancora il problema – bilbinight

+0

Qual è la necessità di creare rootview come oggetto globale e perché lo si sta rendendo nulla. – bGorle

risposta

0

Alla fine l'ho fatto con DialogFragments, perché avevo bisogno di andare avanti. Ad ogni modo, sarebbe bello se qualcuno sapesse qualcosa su come superare il problema nel modo in cui ho spiegato nella domanda per gli sviluppi futuri.

Grazie

Problemi correlati