Autore Topic: Switch Layout da verticale a orizzontale  (Letto 354 volte)

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Switch Layout da verticale a orizzontale
« il: 16 Marzo 2016, 12:23:15 CET »
0
Ciao a tutti =)

Premetto che sono nuovo nel mondo dello sviluppo android..


Ho un problema con la visualizzazione del layout  quando ruoto lo schermo da orizzontale a verticale.


In poche parole ho creato un layout land (layout-sw720dp-land/esempio.xml) e uno port (layout-sw720dp-port/esempio.xml)...

Fin qui tutto ok.. a quello port ho dato delle dimensioni precise e a quello land altre dimensioni precise..

Precedentemente avevo un problema con lo switch dei due layout ovvero il passaggio da layout  orizzontale a verticale passava correttamente ma l'activity veniva distrutta e ricreata..

Ho risolto questo problema mettendo nell'AndroidManifest.xml questo codice..

Codice (Java): [Seleziona]
android:configChanges="orientation|screenSize"

Il problema è che ora il passaggio da orizzontale a verticale non avviene automatico..  ad esempio... Apro l'app in orizzontale e visualizza il layout corretto ( per intenderci il layout-sw720dp-land/esempio.xml dato che uso un tablet) però una volta aperta l'app se giro il tablet in verticale, il layout verticale non viene visualizzato ma rimane quello in versione orizzontale..( per esempio nel layout orizzontale ho un bottone con scritto "Inizia" mentre in quello verticale ho lo stesso bottone con scritto "Finisci" e quando l'app è aperta e giro il tablet da orizzontale a verticale mi gira il layout facendomi però rimanere il layout creato per la versione orizzontale, quindi con il bottone "inizia").

Come posso fare far visualizzare il layout corretto SENZA ricreare e distruggere l'activity??


N.B: Uso i fragment... in poche parole ho un file activity_main.xml che fa riferimento all activity MainActivity.java che al suo interno ha questo codice
 
Codice (Java): [Seleziona]
<FrameLayout
            android:layout_below="@+id/toolbar"
            android:id="@+id/fragment_container"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:foreground="@drawable/shadow_toolbar"/>

all'interno di questo FrameLayout visualizzo i due layout in questo modo :

Codice (Java): [Seleziona]
FragmentEsempio fragment = new FragmentEsempio();
            android.support.v4.app.FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();


Nel FragmentEsempio.java ci sono i due famosi layout..

Codice (Java): [Seleziona]
public class FragmentEsempio extends Fragment {


    public FragmentEsempio() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.esempio, container, false);

        // Inflate the layout for this fragment
        return rootView;
    }


}


Come posso fare quindi per fare lo switch automatico dei due layout senza chiudere e riaprire l'app e senza farla ricreare??

Scusate se sono stato troppo contorto =)







Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Switch Layout da verticale a orizzontale
« Risposta #1 il: 16 Marzo 2016, 13:29:38 CET »
0
Il modo corretto è proprio quello di lasciare che l'Activity venga distrutta e ricreata.
Altrimenti si deve fare override del metodo onConfigurationChanged e gestire il tutto a mano.

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Re:Switch Layout da verticale a orizzontale
« Risposta #2 il: 16 Marzo 2016, 13:48:43 CET »
0
Non c'è nessun altro modo?? Perfhe tutte le volte che viene ricreata mi reinizializza anche il fragment..
Ad esempio.. Ho un layout del fragment che ha una dialog che si apre tutte le volte che viene inizializzato e sotto alla dialog quando viene chiusa c'è una editext.. Se faccio lo switch da orizzontale a verticale con la distruzione dell activity e la reinizializzazione.. Tutte le volte appare la dialog e azzera ad esempio la casella di testo.. Io invece vorrei che quando gira riparte dal punto in cui ero cambiando layout (che ovviamente sarà cambiato solo nelle dimensioni e non nel contenuto) chiedo scusa se sono stato contorto

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Switch Layout da verticale a orizzontale
« Risposta #3 il: 16 Marzo 2016, 15:01:12 CET »
0
Prova ad usare gli stessi id per i componenti equivalenti dei due layout, eliminando finestre di dialogo che si aprono in automatico.

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Re:Switch Layout da verticale a orizzontale
« Risposta #4 il: 16 Marzo 2016, 15:05:44 CET »
0
Gli id sono identici in tutti e due i layout in quanto all'interno sono solo diverse le dimensioni e il testo di un bottone ( nel layout orizzontale cè scritto "inizia" e nel verticale " finisci") ma gli id sono completamente identici e ovviamente anche i nomi di tutti e due i layout..

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Switch Layout da verticale a orizzontale
« Risposta #5 il: 16 Marzo 2016, 15:18:30 CET »
0
Credo di non aver capito bene qual è il tuo problema...
« Ultima modifica: 16 Marzo 2016, 18:32:42 CET da iClaude »

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Re:Switch Layout da verticale a orizzontale
« Risposta #6 il: 16 Marzo 2016, 15:31:04 CET »
0
E possibile farglielo vedere a livello pratico? vedendo direttamente il progetto e l'app? se per lei non è un problema =)
In poche parole vorrei (usando qualsiasi soluzione) switchare il layout da orizzontale a verticale senza far distruggere e ricostruire l'app..

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Switch Layout da verticale a orizzontale
« Risposta #7 il: 16 Marzo 2016, 18:32:28 CET »
0
Come già detto, la soluzione migliore è togliere dal Manifest
android:configChanges="orientation|screenSize"
e lasciare che Android distrugga e ricrei l'Activity. Se serve salvare qualche valore che non viene salvato in automatico si possono usare i metodi onSaveInstanceState e onRestoreInstanceState.

Mettendo nel Manifest
android:configChanges="orientation|screenSize"
l'Activity non viene ricreata, ma viene chiamato il metodo onConfigurationChanged. In teoria potresti impostare il nuovo layout all'interno di questo metodo con setContentView, ma questa è una soluzione non ottimale che potrebbe creare altri problemi. Cmq prova e vedi il risultato...