JavascriptProva

lunedì 3 ottobre 2016

Differente necessità di onSaveInstanceState fra API 19 e API 22

Ho un listener.
Che funzioni svolge questo listener?

Quando accade qualcosa che modifica lo status dell'applicazione, accade questo:
mLucchettiChangeListener.onLucchettiChange(leftLock,rightLock);
Ossia viene attivato il metodo della variabile che rappresenta l'interfaccia, portando come parametri gli status dei due lucchetti sinistro e destro.
Viene triggerato il metodo onLucchettiChange, che porta come parametri gli status dei due lucchetti.

L'interfaccia è questa:
//interfaccia per il Custom Listener del cambio della variabile settingMode.
interface OnLucchettiChangeListener{
    public void onLucchettiChange(boolean lucch1, boolean lucch2);
}
e la definizione del setter è questa:
    //definizione del setter per  il custom listener della variabile settingMode
    private void setOnLucchettiChangeListener(OnLucchettiChangeListener onLucchettiChangeListener){
        mLucchettiChangeListener=onLucchettiChangeListener;
    }
Una volta, quindi, che mLucchettiChangeListener è stata assimilata all'interfaccia, avente un metodo con due parametri booleani, si può triggerare questo metodo fornendovi i due parametri.

Il setter dice che lo status SettingMode varia a seconda dello stato dei due parametri.


Il codice funziona in modo diverso a seconda dell'API.
Mi scrivo tutto onCreate:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);




        //istanziazione dell'oggetto helper:
        helper=new Helper(this);

        //istanziazione del mainLayout e della barra delle categorie (didascalia sotto)
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
        scrollView=(ScrollView)findViewById(R.id.scrollView);
        txtBarraCategoria=(TextView)findViewById(R.id.txtBarraCategoria);
        //istanziazione delle immagini dei lucchetti
        lucchettoSinistro=(ImageView)findViewById(R.id.lucchettoSinistro);
        lucchettoDestro=(ImageView)findViewById(R.id.lucchettoDestro);


        //EVENT LISTENER DEI LUCCHETTI PER PASSARE A SETTINGMODE

        lucchettoListener = new View.OnLongClickListener() {


            @Override
            public boolean onLongClick(View v) {
                if(v==lucchettoSinistro){
                    leftLock=(leftLock==false? true : false);
                }

                if(v==lucchettoDestro){
                    rightLock=(rightLock==false? true : false);
                }

                Vibrator vibrator =(Vibrator)getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
                vibrator.vibrate(500);

                mLucchettiChangeListener.onLucchettiChange(leftLock,rightLock);
                return true;
            }
        };

        lucchettoSinistro.setOnLongClickListener(lucchettoListener);
        lucchettoDestro.setOnLongClickListener(lucchettoListener);


        //l'applicazione del setter del custom listener per la variabile settingMode
        setOnLucchettiChangeListener(new OnLucchettiChangeListener() {
                @Override
            public void onLucchettiChange(boolean lucch1, boolean lucch2) {
               if(lucch1) lucchettoSinistro.setImageResource(R.drawable.lucaperto);
               else lucchettoSinistro.setImageResource(R.drawable.lucchiuso);

                if(lucch2) lucchettoDestro.setImageResource(R.drawable.lucaperto);
                else lucchettoDestro.setImageResource(R.drawable.lucchiuso);

                if(lucch1 && lucch2) {
                    settingMode=true;
                    mainLayout.setBackgroundColor(Color.GRAY);
                }
                if(!lucch1 && !lucch2) {
                    settingMode=false;
                    mainLayout.setBackgroundColor(Color.BLACK);
                }
            }
        });

        //MAINLAYOUT.ONTOUCHLISTENER
        mainLayout.setOnTouchListener(new View.OnTouchListener(){

            @Override
            public boolean onTouch(View view, MotionEvent event) {
                mlX=(int)event.getX();
                mlY=(int)event.getY();

                return false;
            }
        });

        //il LONG CLICK sul MAINLAYOUT per la visualizzazione di ImagePick
        mainLayout.setOnLongClickListener(new View.OnLongClickListener(){

            @Override
            public boolean onLongClick(View view) {
                if(!settingMode) return false;
                Intent intent=new Intent(getApplicationContext(),ImagePick.class);
                intent.putExtra("Categoria","iniziale");
                intent.putExtra("CoordX",mlX);
                intent.putExtra("CoordY",mlY);
                startActivity(intent);
                return true;
            }
        });

    }
Ecco onStart:
    @Override
    protected void onStart(){
        super.onStart();
        mLucchettiChangeListener.onLucchettiChange(leftLock,rightLock);
        Toast.makeText(getApplicationContext(),leftLock+" "+rightLock,Toast.LENGTH_LONG).show();
        refreshScreen();
    }
Ci ho messo il Toast per vedere in che stato si trovano le variabili leftLock e rightLock che esprimono lo stato di apertura dei lucchetti, e in un telefono si trovano in false mentre in un altro (API 22) si trovano in true.
Evidentemente il sistema operativo più moderno non ha bisogno di salvare le impostazioni quando l'activity venga ridotta allo stato stopped.
Provo a salvare per risolvere il bug sul cellulare più antico.

Ci metto intanto questo metodo:
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState){
        savedInstanceState.putBoolean("leftLock",leftLock);
        savedInstanceState.putBoolean("rightLock",rightLock);
    }
E lo recupero in onCreate:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(savedInstanceState!=null){
            leftLock=savedInstanceState.getBoolean("leftLock");
            rightLock=savedInstanceState.getBoolean("rightLock");
        }
Ecco, adesso sia con l'API 19 che con l'API 22 la funzionalità è la stessa!

Nessun commento:

Posta un commento