JavascriptProva

lunedì 5 settembre 2016

Riscrittura del Communicator: lucchetti e salvataggio delle loro posizioni per mantenere le impostazioni di settingMode.

Adesso mi sento pronto per riscrivere il mio Communicator (purtroppo alla luce della mia esperienza attuale quel codice mi appare un po' appiccicaticcio e insidioso...).


Ecco: ho sistemato i lucchetti che shiftano fra normal mode e setting mode:
public class MainActivity extends AppCompatActivity {

    View.OnLongClickListener lucchettoListener;
    
    //le immagini dei lucchetti per lo shiftaggio da e a settingMode
    ImageView lucchettoSinistro;
    ImageView lucchettoDestro;

    //LA VARIABILE PIU' IMPORTANTE, che stabilisce il modo setting o quello normale.
    boolean settingMode;
    
    //Variabili relative alle componenti della finestra
    RelativeLayout mainLayout;
    ScrollView scrollView;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //istanziazione delle immagini dei lucchetti
        lucchettoSinistro=(ImageView)findViewById(R.id.lucchettoSinistro);
        lucchettoDestro=(ImageView)findViewById(R.id.lucchettoDestro);


        //EVENT LISTENER DELLE VITI PER PASSARE A SETTINGMODE

        lucchettoListener = new View.OnLongClickListener() {
            boolean boolLucchettoSinistroAperto,boolLucchettoDestroAperto;

            @Override
            public boolean onLongClick(View v) {
                if(v==lucchettoSinistro){
                    if(boolLucchettoSinistroAperto==false){
                        lucchettoSinistro.setImageResource(R.drawable.lucaperto);
                        boolLucchettoSinistroAperto=true;
                    }else{
                        lucchettoSinistro.setImageResource(R.drawable.lucchiuso);
                        boolLucchettoSinistroAperto=false;
                    }
                }

                if(v==lucchettoDestro){
                    if(boolLucchettoDestroAperto==false){
                        lucchettoDestro.setImageResource(R.drawable.lucaperto);
                        boolLucchettoDestroAperto=true;
                    }else{
                        lucchettoDestro.setImageResource(R.drawable.lucchiuso);
                        boolLucchettoDestroAperto=false;
                    }
                }

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

                if(boolLucchettoSinistroAperto==true && boolLucchettoDestroAperto==true){
                    settingMode=true;

                }
                if(boolLucchettoSinistroAperto==false && boolLucchettoDestroAperto==false){
                    settingMode=false;

                }
                System.out.println("SETTING MODE"+settingMode);
                return true;

            }
        };

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

    }
}
(il codice in verde è solo per farmi da segnale, e andrà eliminato).

Okay! Ora devo definire due status, uno per il normal mode e uno per il setting mode.
Opto per non mettere in questi status lo stato di apertura o chiusura dei lucchetti, perché questi semmai si potranno conservare in savedInstanceStatus.

Ma prima creo un listener customizzato per la variabile settingMode.

Ecco creato il tutto. Funziona.
public class MainActivity extends AppCompatActivity {

    //Dichiarazione del listener per i lucchetti
    View.OnLongClickListener lucchettoListener;

    //le immagini dei lucchetti per lo shiftaggio da e a settingMode
    ImageView lucchettoSinistro;
    ImageView lucchettoDestro;

    //LA VARIABILE PIU' IMPORTANTE, che stabilisce il modo setting o quello normale.
    boolean settingMode;

    //Variabili relative alle componenti della finestra
    RelativeLayout mainLayout;
    ScrollView scrollView;

    //per la creazione di un custom listener per il cambio modo setting/modo normale
    OnModeChangeListener mModeChangeListener;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //istanziazione del mainLayout
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);

        //istanziazione delle immagini dei lucchetti
        lucchettoSinistro=(ImageView)findViewById(R.id.lucchettoSinistro);
        lucchettoDestro=(ImageView)findViewById(R.id.lucchettoDestro);


        //EVENT LISTENER DELLE VITI PER PASSARE A SETTINGMODE

        lucchettoListener = new View.OnLongClickListener() {
            boolean boolLucchettoSinistroAperto,boolLucchettoDestroAperto;

            @Override
            public boolean onLongClick(View v) {
                if(v==lucchettoSinistro){
                    if(boolLucchettoSinistroAperto==false){
                        lucchettoSinistro.setImageResource(R.drawable.lucaperto);
                        boolLucchettoSinistroAperto=true;
                    }else{
                        lucchettoSinistro.setImageResource(R.drawable.lucchiuso);
                        boolLucchettoSinistroAperto=false;
                    }
                }

                if(v==lucchettoDestro){
                    if(boolLucchettoDestroAperto==false){
                        lucchettoDestro.setImageResource(R.drawable.lucaperto);
                        boolLucchettoDestroAperto=true;
                    }else{
                        lucchettoDestro.setImageResource(R.drawable.lucchiuso);
                        boolLucchettoDestroAperto=false;
                    }
                }

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

                if(boolLucchettoSinistroAperto==true && boolLucchettoDestroAperto==true){
                    settingMode=true;


                }
                if(boolLucchettoSinistroAperto==false && boolLucchettoDestroAperto==false){
                    settingMode=false;

                }

                mModeChangeListener.onModeChange(settingMode);
                return true;

            }
        };

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


        //l'applicazione del setter del custom listener per la variabile settingMode
        setOnModeChangeListener(new OnModeChangeListener() {
            @Override
            public void onModeChange(boolean mode) {
                if(mode==false){
                    configuraNormalMode();
                }
                else{
                    configuraSettingMode();
                }
            }
        });



    }
    
    //definizione del setter per il custom listener della variabile settingMode
    private void setOnModeChangeListener(OnModeChangeListener onModeChangeListener){
        mModeChangeListener=onModeChangeListener;
    }

    // i metodi che configurano l'aspetto delle finestre per le due modalità setting e normale
    private void configuraSettingMode(){
        mainLayout.setBackgroundColor(Color.GRAY);
    }
    private void configuraNormalMode(){
        mainLayout.setBackgroundColor(Color.BLACK);
    }
}

//interfaccia per il Custom Listener del cambio della variabile settingMode.
interface OnModeChangeListener{
    public void onModeChange(boolean mode);
}

Ora mi preoccuperei di mettere in salvo la variabile booleana settingMode tramite saveInstanceState.
Creo la funzione onSavedInstanceState.
    @Override
    protected void onSaveInstanceState(Bundle state){
        state.putSerializable("settingmode",settingMode);
    }
e poi devo scegliere un punto di onCreate in cui riesumare il valore...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState!=null
                && savedInstanceState.getSerializable("settingmode")!=null){
            settingMode=(boolean)savedInstanceState.getSerializable("settingmode");
        }
Dovrebbe andar bene.

Posso fare delle prove introducendo una seconda activity...

Sempre problematico...

Idea! Invece di salvare settingMode posso salvare la posizione dei lucchetti!


Ciò si è rivelato vincente.
Scrivo qui tutto il codice fatto finora:
public class MainActivity extends AppCompatActivity {

    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    //DICHIARAZIONI DELLE VARIABILI
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    //Dichiarazione del listener per i lucchetti
    View.OnLongClickListener lucchettoListener;

    //le immagini dei lucchetti per lo shiftaggio da e a settingMode
    ImageView lucchettoSinistro;
    ImageView lucchettoDestro;

    //lo stato dei lucchetti
    boolean boolLucchettoSinistroAperto,boolLucchettoDestroAperto;

    //LA VARIABILE PIU' IMPORTANTE, che stabilisce il modo setting o quello normale.
    boolean settingMode;

    //Variabili relative alle componenti della finestra
    RelativeLayout mainLayout;
    ScrollView scrollView;

    //per la creazione di un custom listener per il cambio modo setting/modo normale
    OnLucchettiChangeListener mLucchettiChangeListener;

    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

        //Ripristino delle variabili con savedInstanceState
        if(savedInstanceState!=null){
            if(savedInstanceState.getSerializable("boolLucchettoSinistroAperto")!=null) {
                boolLucchettoSinistroAperto = (boolean) savedInstanceState
                        .getSerializable("boolLucchettoSinistroAperto");
            }
            if(savedInstanceState.getSerializable("boolLucchettoDestroAperto")!=null) {
                boolLucchettoDestroAperto = (boolean) savedInstanceState
                        .getSerializable("boolLucchettoDestroAperto");
            }

        }

        //istanziazione del mainLayout
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);

        //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){
                    boolLucchettoSinistroAperto=(boolLucchettoSinistroAperto==false? true : false);
                }

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

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

                mLucchettiChangeListener.onLucchettiChange(boolLucchettoSinistroAperto,boolLucchettoDestroAperto);
                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;
                    configuraSettingMode();
                }
                if(!lucch1 && !lucch2) {
                    settingMode=false;
                    configuraNormalMode();
                }
            }
        });


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

            @Override
            public boolean onLongClick(View view) {
                Intent intent=new Intent(getApplicationContext(),ImagePick.class);
                startActivity(intent);
                return false;
            }
        });





    }

    //definizione del setter per il custom listener della variabile settingMode
    private void setOnLucchettiChangeListener(OnLucchettiChangeListener onLucchettiChangeListener){
        mLucchettiChangeListener=onLucchettiChangeListener;
    }

    // i metodi che configurano l'aspetto delle finestre per le due modalità setting e normale
    private void configuraSettingMode(){
        mainLayout.setBackgroundColor(Color.GRAY);
    }
    private void configuraNormalMode(){
        mainLayout.setBackgroundColor(Color.BLACK);
    }



    //per il salvataggio delle variabili in saveInstanceState
    @Override
    protected void onSaveInstanceState(Bundle state){
        super.onSaveInstanceState(state);
        state.putSerializable("boolLucchettoSinistroAperto",boolLucchettoSinistroAperto);
        state.putSerializable("boolLucchettoDestroAperto",boolLucchettoDestroAperto);
    }

    @Override
    protected void onStart(){
        super.onStart();
        mLucchettiChangeListener.onLucchettiChange(boolLucchettoSinistroAperto,boolLucchettoDestroAperto);
        System.out.println(settingMode);

    }
}

//interfaccia per il Custom Listener del cambio della variabile settingMode.
interface OnLucchettiChangeListener{
    public void onLucchettiChange(boolean lucch1, boolean lucch2);
}

Nessun commento:

Posta un commento