Autore Topic: EditText: problemi vari nel cambiare colore e ripristinare il colore di default  (Letto 737 volte)

Offline jkr

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Ciao a tutti sto realizzando la mia prima applicazione android. Dato che questo è anche il mio primo messaggio sul forum perdo un pò di tempo con questa premessa. Si tratta di un'applicazione senza fine pratico: è un esercizio che mi sono inventato in cui si deve gestire delle persone e l'ufficio in cui lavorano (salvando i dati con sqlite) e implementando le funzioni classiche di inserimento, modifica, visualizzazione e cancellazione degli oggetti nel mini database.

Allego quindi i sorgenti (EsercizioUfficiPersone.zip) del mio esercizio nella speranza che possano essere d'aiuto a qualche utente prima di sottoporre al forum il mio primo dubbio.

Il mio problema invece riguarda le Activity in cui inserisco o modifico degli oggetti. Tramite degli EditText permetto all'utente di inserire i valori che poi andrò a salvare nel database sqlite.

Se l'utente compila correttamente i campi va tutto bene, i miei problemi nascono quando l'utente non rispetta le regole di validazione (es. non compila un campo obbligatorio) perchè per il momento non riesco a far fare all'applicativo quello che vorrei.

Vorrei che, se l'utente sbaglia a compilare un campo, l'EditText relativo diventasse di colore rosso, per poi tornare del colore originale (bianco) non appena l'utente riprende a digitare quel campo.


L'activity di esempio in cui sto sbattendo la testa è InserisciUfficioActivity.java. Ho due strade che ho provato:

1)Nel caso dell'EditText inputNumeroUfficio riesco a cambiare colore e a ritornare al colore originale ma quando diventa rosso perde i bordi smussati (diventa brutto e spigoloso).

2)Nel caso di inputNomeUfficio invece non riesco a ritornare al colore originale perchè non riesco a farmi una copia (mi fa solo copie per "riferimento") dell'oggetto Drawable.

Ecco la classe (comunque c'è tutto nel file allegato e facendo girare l'applicazione si capisce bene il mio problema magari non descritto benissimo a parole) :

Codice (Java): [Seleziona]
package che.pacco.activity.impl;

import android.graphics.ColorFilter;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.DrawableContainer;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.EditText;
import android.widget.TextView;
import che.pacco.R;
import che.pacco.activity.AbstractActivity;
import che.pacco.activity.InsertAndModGenericInterface;
import che.pacco.common.CommonConstants;
import che.pacco.db.domaindto.UfficioDto;
import che.pacco.utils.android.GraphicalValidationUtils;
import che.pacco.utils.android.MyDrawable;

public class InserisciUfficioActivity extends AbstractActivity implements InsertAndModGenericInterface {
       
        private EditText inputNomeUfficio = null;
        private EditText inputNumeroUfficio = null;
        private TextView titoloActivity = null;
       
        //colore default degli edit text delle maschere di inserimento-modifica dati:
        protected Drawable inputNomeUfficioDefaultBackground = null;
        protected Drawable inputNumeroUfficioDefaultBackground = null;

       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try{
                super.onCreate(savedInstanceState);
            setContentView(R.layout.mascherainputufficio);
            activityCorrente = InserisciUfficioActivity.class;
            inputNomeUfficio = (EditText) findViewById(R.id.campoInputNomeUfficio);
                inputNumeroUfficio = (EditText) findViewById(R.id.campoInputNumeroUfficio);
                //memorizzo il colore di defualt degli EditText:
//              inputNomeUfficioDefaultBackground = (MyDrawable) new MyDrawable(inputNomeUfficio.getBackground()).clone() ;
                inputNomeUfficioDefaultBackground = inputNomeUfficio.getBackground() ;
                inputNumeroUfficioDefaultBackground = inputNumeroUfficio.getBackground();
                setEditTextListenersForDefaultColor();
                titoloActivity = (TextView) findViewById(R.id.textViewTitoloInputUffici);
                titoloActivity.setText("Inserisci Ufficio");
                impostaDatiDefault();
        } catch (Exception e) {
                        genericExceptionHandler(e);
                }
    }
   
   
    private void impostaDatiDefault(){
        inputNomeUfficio.setText("");
        inputNumeroUfficio.setText("");
    }
   
    public void executeAnnulla(View v){
        try{
                impostaDatiDefault();
        } catch (Exception e) {
                        genericExceptionHandler(e);
                }
    }
   
    public void executeConferma(View v){
        try{
               
                //validazione dei dati:
                boolean erroriValidazione = false;
               
                if(GraphicalValidationUtils.isEmpty(inputNomeUfficio)){
                        //campo nome ufficio non compilato
                        Drawable backGround = (Drawable) inputNomeUfficio.getBackground();
                        backGround.setColorFilter(CommonConstants.ROSSO_CAMPO_INPUT_NON_VALIDO, android.graphics.PorterDuff.Mode.DARKEN);
//                      backGround.setColorFilter(new ColorFilter());
//                      inputNomeUfficio.setBackgroundColor(CommonConstants.ROSSO_CAMPO_INPUT_NON_VALIDO);
                        inputNomeUfficio.setBackgroundDrawable(backGround);
                        erroriValidazione = true;
                }
                if(GraphicalValidationUtils.isEmpty(inputNumeroUfficio)){
                        //campo numero ufficio non compilato
                        inputNumeroUfficio.setBackgroundColor(CommonConstants.ROSSO_CAMPO_INPUT_NON_VALIDO);
                        erroriValidazione = true;
                }
               
                if(!erroriValidazione){
                        //salvataggio nel db:
                UfficioDto ufficioDaInserire = new UfficioDto();
                ufficioDaInserire.setNomeUfficio(inputNomeUfficio.getText().toString());
                ufficioDaInserire.setNumero(new Integer(inputNumeroUfficio.getText().toString()));
                dao.inserisciUfficio(ufficioDaInserire);
               
                //torno alla pagina di consultazione:
                gotoIndietro();
                }
               
        } catch (Exception e) {
                        genericExceptionHandler(e);
                }
    }
   
    //ripristina il colore di default degli edit text delle maschere di inserimento-modifica dati:
    private void setEditTextListenersForDefaultColor(){
        inputNomeUfficio.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View arg0) {
                                inputNomeUfficio.setBackgroundDrawable(inputNomeUfficioDefaultBackground);
                               
                        }
                });
        inputNomeUfficio.setOnTouchListener(new OnTouchListener() {
                       
                        @Override
                        public boolean onTouch(View arg0, MotionEvent arg1) {
                                inputNomeUfficio.setBackgroundDrawable(inputNomeUfficioDefaultBackground);
                                return false;
                        }
                });
        inputNumeroUfficio.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View arg0) {
                                inputNumeroUfficio.setBackgroundDrawable(inputNumeroUfficioDefaultBackground);
                               
                        }
                });
        inputNumeroUfficio.setOnTouchListener(new OnTouchListener() {
                       
                        @Override
                        public boolean onTouch(View arg0, MotionEvent arg1) {
                                inputNumeroUfficio.setBackgroundDrawable(inputNumeroUfficioDefaultBackground);
                                return false;
                        }
                });
    }
   
}
« Ultima modifica: 02 Febbraio 2012, 17:03:11 CET da jkr »

Offline jkr

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Re:EditText: problemi vari nel cambiare colore e ripristinare il colore di default
« Risposta #1 il: 03 Febbraio 2012, 11:15:40 CET »
0
Ok ho risolto da solo. Spero possa essere d'aiuto a qualcuno:

Se inputNomeUfficio è l'EditText che voglio far diventare rosso e poi farlo ritornare originale (bianco):

//variabile globale di Activity:
Drawable backGround =  inputNomeUfficio.getBackground();

......

//Codice dell'evento per cui deve diventare rosso:
backGround.setColorFilter(android.graphics.Color.RED, android.graphics.PorterDuff.Mode.MULTIPLY);
inputNomeUfficio.setBackgroundDrawable(backGround);


//Codice dell'evento per cui deve ritornare bianco:
backGround.setColorFilter(android.graphics.Color.WHITE, android.graphics.PorterDuff.Mode.MULTIPLY);
inputNomeUfficio.setBackgroundDrawable(backGround);

Sono andato un pò per tentativi...android.graphics.PorterDuff.Mode.MULTIPLY mantiene i bordi ben fatti senza far diventare l'EditText un quadrato rosso e spigoloso...