Autore Topic: Rotazione schermo e fragment  (Letto 767 volte)

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Rotazione schermo e fragment
« il: 19 Giugno 2015, 01:21:38 CEST »
0
Ciao a tutti è da diversi giorni che sbatto la testa con il fatto che se ruota lo schermo le activity vengono distrutte vediamo se insieme arriviamo al punto.
io ho questa situazione
dalla mia main activity che utilizza la NavigationDrawer
Codice (Java): [Seleziona]
public class MainActivity extends ActionBarActivity
        implements NavigationDrawerFragment.NavigationDrawerCallbacks {
viene richiamato il mio bel Fragment
Codice (Java): [Seleziona]
import android.app.Fragment;
........
public class RegistraLocale extends Fragment{

nel quale tramite un apposito Button viene acquisita la foto da camera , tutto funziona per il meglio se fatto da emulatore " in quanto lo schermo non ruota "
se faccio il debug con lo smartphone " Samsung Note 3 ", nel momento in cui parte la
Codice (Java): [Seleziona]
public void onActivityResult(int requestCode, int resultCode, Intent data)per il prelievo della foto , in questo caso lo schermo ruota e dopo che essa viene acquisita mi ritrovo nel mio bel fragment ripartito da 0... a tal proposito ho fatto le mie ricerche e indubbiamente dipende dallo schermo che ruota. a forza di cercare mi ritrova che quando ruota lo schermo bisogna far salvare lo stato attuale tramite
Codice (Java): [Seleziona]
public void onSaveInstanceState(Bundle outState)settare successivamente
Codice (Java): [Seleziona]
@Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("Create", "In frag's on create");
        [s]this.setRetainInstance(true);[/s]
    }

e per finire far acquisire il tutto nel seguente modo
Codice (Java): [Seleziona]
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){
.....................
if(savedInstanceState!=null && savedInstanceState.getSerializable("SavedInstance") !=null){
            .................
        }
ora tutto mi si presenta abbastanza fattibile al che penso il bundl non mi consente di inserire direttamente l' eventuale bitmap presa da telecamera quindi penso , furbata e improvviso questo adapter
Codice (Java): [Seleziona]
public class AdapterBundleSavedInstance implements Serializable {
    private static final long serialVersionUID=-2163051469151804394L;
    private Bitmap bitmap;
    public void setBitmap(Bitmap bitmap){ this.bitmap=bitmap; }
    public Bitmap getBitmap() { return bitmap; }
}

e questo punto proseguo in questo modo .....
Codice (Java): [Seleziona]
@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        myAdapter=new AdapterBundleSavedInstance();
        Log.d("Saved:", "FragmentOne.onSaveInstanceState");
        myAdapter.setBitmap(bitmapCameraDefault);
        outState.putSerializable("SavedInstance", myAdapter);
    }

per finire nell onCreatView cosi
Codice (Java): [Seleziona]
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){

        final View rootView = inflater.inflate(R.layout.registralocale, container, false);
        imgTop=(ImageView) rootView.findViewById(R.id.imgTop);
        if(savedInstanceState!=null && savedInstanceState.getSerializable("SavedInstance") !=null){
            myAdapter= (AdapterBundleSavedInstance) savedInstanceState.getSerializable("SavedInstance");
            if(myAdapter.getBitmap()!=null) {
                bitmapCameraAction=myAdapter.getBitmap();
                imgTop.setImageBitmap(bitmapCameraAction);
            }
        }
..............

il risultato è che nel momento in cui si apre la camera l' app va in crash " PRIMA ancora che possa scattare la foto ..."
qualcuno ha idee in proposito ? davvero ho cercato di tutto e non trovo un esempio concreato che risolva questo problema  >:(
a seguire il LogCat del crash
E/AndroidRuntime﹕ FATAL EXCEPTION: main

    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.admin.AdapterBundleSavedInstance)
            at android.os.Parcel.writeSerializable(Parcel.java:1388)
            at android.os.Parcel.writeValue(Parcel.java:1335)
            at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
            at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
            at android.os.Bundle.writeToParcel(Bundle.java:1096)
            at android.os.Parcel.writeBundle(Parcel.java:663)
            at android.app.FragmentState.writeToParcel(Fragment.java:147)
            at android.os.Parcel.writeTypedArray(Parcel.java:1191)
            at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:380)
            at android.os.Parcel.writeParcelable(Parcel.java:1357)
            at android.os.Parcel.writeValue(Parcel.java:1262)
            at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
            at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
            at android.os.Bundle.writeToParcel(Bundle.java:1096)
            at android.os.Parcel.writeBundle(Parcel.java:663)
            at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3076)
            at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3770)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5940)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
     Caused by: java.io.NotSerializableException: android.graphics.Bitmap
            at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
            at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
            at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
            at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
            at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
            at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
            at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
            at android.os.Parcel.writeSerializable(Parcel.java:1383)
            at android.os.Parcel.writeValue(Parcel.java:1335)
            at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
            at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
            at android.os.Bundle.writeToParcel(Bundle.java:1096)
            at android.os.Parcel.writeBundle(Parcel.java:663)
            at android.app.FragmentState.writeToParcel(Fragment.java:147)
            at android.os.Parcel.writeTypedArray(Parcel.java:1191)
            at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:380)
            at android.os.Parcel.writeParcelable(Parcel.java:1357)
            at android.os.Parcel.writeValue(Parcel.java:1262)
            at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
            at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
            at android.os.Bundle.writeToParcel(Bundle.java:1096)
            at android.os.Parcel.writeBundle(Parcel.java:663)
            at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3076)
            at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3770)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5940)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)

Post unito: 19 Giugno 2015, 12:50:08 CEST
in aggiunta, ho tolto di mezzo l'oggetto in cui salvato il bitmap e sto provando con l' esempio più banale , quindi salvando una semplice stringa, il risultato è che funziona per metà, posto il codice con le modifiche
Codice (Java): [Seleziona]
@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("SavedInstance", "Test Stringa");
        Log.e("onSaved ", "ok");
       
    }
    @Override
    public void onDestroyView() {

        Log.e("onDestroyView", " ok");
        super.onDestroyView();
    }
@Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("Create", "In frag's on create");
        setRetainInstance(true);
    }
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){
        Bundle B=getArguments();
        final View rootView = inflater.inflate(R.layout.registralocale, container, false);
        if(savedInstanceState != null ) {
            testSave = savedInstanceState.getString("SavedInstance");
            Toast.makeText(getActivity(), testSave, Toast.LENGTH_SHORT);
            EditText e_mail=(EditText) rootView.findViewById(R.id.nomeLocale);
            e_mail.setText(testSave);
            Log.e("onCreateView :", testSave);
        }
...................
}

ora il log cat mostra quanto segue " ve lo pulisco un po' "

06-19 12:35:58.774  31729-31729/com.example.admin E/onSaved﹕ ok
06-19 12:35:58.774  31729-31729/com.example.admin E/onDestroyView﹕ ok
06-19 12:35:59.014  31729-31729/com.example.admin E/onCreateView :﹕ Test Stringa
06-19 12:35:59.014  31729-31729/com.example.admin E/onDestroyView﹕ ok
06-19 12:35:59.014  31729-31729/com.example.admin V/Create﹕ In frag's on create
06-19 12:35:59.034  31729-31729/com.example.admin E/onDestroyView﹕ ok
06-19 12:35:59.034  31729-31729/com.example.admin V/Create﹕ In frag's on create

ora le riflessioni sono , esegue il salvataggio e la stringa viene passata
06-19 12:35:59.014  31729-31729/com.example.admin E/onCreateView :﹕ Test Stringa


ma perché successivamente viene chiamato per due volte
onDestroyView e onCreate
e non viene più chiamato onCreateView ?

sul display ciò che esce nel momento in cui ruoto lo schermo è semplicemente il fragmnet ripartito da 0 , che sia la NavigationDrawer che complica le cose ?

help  :-(
« Ultima modifica: 19 Giugno 2015, 12:50:08 CEST da pietroconti89, Reason: Merged DoublePost »

Offline filosofo

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Rotazione schermo e fragment
« Risposta #1 il: 24 Giugno 2015, 10:01:04 CEST »
0
Per far in modo che lo schermo non ruoti vai sul manifest.xml della tua app e all' interno del tag dell' Activity che genera il problema inserisci l' attributo android:screenOrientation="Potrait" per far in modo ad esempio che la schermata dell' activity sia sempre verticale mentre se vuoi che sia sempre orizzontale metti android:screenOrientation="Landscape".Ora ti do un esempio
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="progetto.example.Esempio.app" >

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:screenOrientation="portrait"
           android:name="progetto.example.Esempio.app.MainActivity"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Rotazione schermo e fragment
« Risposta #2 il: 24 Giugno 2015, 10:14:44 CEST »
0
Ciao in quel modo forzi solo l'app a restare in quello stato ma senza risolvere il problema , una sorta di pagliativo , che in alcuni casi comunque non funziona , nel mio ad esempio l' intento era catturare una foto da camera , solo che nel caso dell emulatore tutto ok , quando testavo su device " Samsung Note 3 " , quando avviavo la Camera con
Codice (Java): [Seleziona]
public void onActivityResult(int requestCode, int resultCode, Intent data)in ogni caso lo schermo ruotava anche se nel manifesto era presente ,
Codice (XML): [Seleziona]
android:screenOrientation="portrait"
comunque alla fine ho risolto , diciamo che avevo fatto qualche cappellata a monte che mi portavano fuori strada , Grazie per l'interessamento  ;-)

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Rotazione schermo e fragment
« Risposta #3 il: 24 Giugno 2015, 18:01:00 CEST »
0
I fragment possono essere "retained". Su un configuration change cioé, non vengono distrutti, ma mantenuti dal FragmentManager (nonostante l'Activity venga distrutta e ricreata)
Rivedi il tutto alla luce di questa cosa.

Potrebbe essere che tu ricrei i fragment e quindi poi e vengono distrutte 2 istanze? Se ad una successiva le destroy diventano 3, 4... potrebbe esserne la causa.

Ciao.

P.S. Non consiglierei di risolvere i problemi di configuration change bloccando la rotazione, i motivi di configuration change possono essere svariati e non necessariamente legati alla rotazione. Meglio risolvere il problema alla radice e vivere più tranquilli.

Post unito: 24 Giugno 2015, 18:02:19 CEST
comunque alla fine ho risolto , diciamo che avevo fatto qualche cappellata a monte che mi portavano fuori strada , Grazie per l'interessamento  ;-)

Come non detto, non avevo letto quest'ultima riga...

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Re:Rotazione schermo e fragment
« Risposta #4 il: 15 Ottobre 2015, 22:03:45 CEST »
0
In ritardissimissimo ti rimando a questo post scritto nel lontano 2010 da un nostro collega: [medio] Rotazione dello schermo e onCreate: problema e soluzioni - Android Developers Italia sicuramente qua troverai la soluzione.

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Rotazione schermo e fragment
« Risposta #5 il: 15 Ottobre 2015, 22:25:03 CEST »
0
Grazie avevo già risolto da un pezzo  :D