Gestione View rotazione schermo.

di il
5 risposte

Gestione View rotazione schermo.

Buongiorno, non riesco a gestire un metodo con una view. In particolare il programma inizia. Quando clicco su un TEXTINPUTEDITTEXT esegue correttamente il metodo clickResearch. Però quando poi ruoto lo schermo mi si cancella la lista e la lunghezza del TEXTINPUTEDITTEXT ritorna comunque 0 nonstante sia valorizzata. Ecco un estratto del codice.:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...................................
clickResearch(?????????????????); COME FACCIO A PASSARGLI LA VIEW

public void clickResearch (View view){
...................................

5 Risposte

  • Re: Gestione View rotazione schermo.

    Lo vedi quel parametro "savedInstanceState" di tipo Bundle che viene passato dal framework al metodo onCreate()? Quello è un Bundle che può contenere dei valori salvati da te al momento della rotazione. O meglio, vengono salvati quando è richiesta la distruzione e, di conseguenza, la successiva ricostruzione dell'Activity.

    Quando tu ruoti il dispositivo accade questo:

    1) L'Activity viene distrutta
    2) Il sistema si configura per la nuova posizione
    3) L'Activity viene ricreata

    Appena prima di distruggere l'Activity il sistema chiama un metodo presente in tutte le Activity e che tu puoi sottoporre ad override: onSaveInstanceState(Bundle savedInstanceState). All'interno di questo metodo tu puoi salvare nel Bundle quello che ti serve per ricostruire in un secondo momento la UI. Questo Bundle verrà poi passato sia a onCreate() che, eventualmente, al metodo onRestoreInstanceState().

    Qui la documentazione: https://developer.android.com/guide/components/activities/activity-lifecycle#saras

    Con queste informazioni dovresti essere in grado di ripristinare la tua EditText come desideri.
  • Re: Gestione View rotazione schermo.

    Aggiungo una cosa: non farti prendere troppo la mano e salvare troppe cose nel Bundle... i sistemi Android impongono un limite (in byte) alla quantità di dati che può essere salvato in questo modo (la quantità dipende da dispositivo a dispositivo e da versione e versione di Android... direi che se superi i 2 MB sei già a rischio).

    La stessa cosa vale per la quantità di dati che viene passata tra un'Activity e l'altra tramite Intent e putExtra()

    Se devi salvare/passare grandi quantità di dati, usa la memorizzazione su localStorage.
  • Re: Gestione View rotazione schermo.

    OK Grazie sei stato chiarissimo!! Ti farò sapere dei risultati
  • Re: Gestione View rotazione schermo.

    Buongiorno SpiritoLibero, ti confermo che sono riuscito a gestire la rotazione grazie a "@Override
    public void onSaveInstanceState(Bundle savedInstanceState)".

    Se possibile ti chiedo solo un'altra cosa. All'evento "onclick" di un TextInputEditText ho collegato un metodo. Però non vedo più la variabile savedInstanceState....il metodo è fuori dal "protected void onCreate(Bundle savedInstanceState)" e credo sia questo il problema, ma se lo inserisco dentro il codice segnala errore...
  • Re: Gestione View rotazione schermo.

    Spiegati meglio: tutti i metodi sono inseriti all'interno di una classe e non è possibile avere metodi dentro ad altri metodi. Quando tu, all'interno di un metodo, fai ad esempio:
    
    public void onCreate(Bundle savedInstanceState) {
        btn.setOnClickListener( new OnClickListener() {
            ...   // Qui sei dentro ad una Anonymous Class non dentro al metodo onCreate()
        });
    }
    
    stai definendo un metodo che non è dentro al metodo onCreate() bensì all'interno di una anonymous inner class (cioè proprio in una classe diversa).

    Ma questo non ha nulla a che vedere con il savedInstanceState. Se vuoi accedere a qualcosa salvato nel savedInstanceState da dentro una anonymous class o, in generale, da dentro un altro metodo, la soluzione più semplice è anche la più banale: crea una variabile di istanza, valorizzala nel onCreate() prendendo il valore dal savedInstanceState e usa quella variabile nel metodo dove ti serve.
    
    public class TuaActivity extends Activity {
        ...
        private String miaVariabile
        ...
        @Override
        public void onCreate(Bundle savedInstanceState) {
            if (savedInstanceState.containsKey("mioValore")) {
                miaVariabile = savedInstanceState.getString("mioValore");
            }
        }
        ...
        private void mioAltroMetodo() {
            Log.d("TuaActivity.class", miaVariabile);   // Loggo il valore che ho ricevuto nel onCreate()
        }
        ...
    }
    
Devi accedere o registrarti per scrivere nel forum
5 risposte