Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[java][android] Raar gedrag Observer/Observable

Pagina: 1
Acties:

  • ventilatorr
  • Registratie: Juli 2010
  • Laatst online: 11-11 21:57
Goeiemiddag,

Ik ben bezig met een Android app die op dit moment 2 views heeft. een view met 3 tekstvelden waarin RGB waarden gezet kunnen worden en een view die zijn achtergrondkleur veranderd naar de waarden uit de tekstvelden. Verder is er een ColorModel class waarin de waarden worden opgeslagen. Deze class erft van Observable. De views implementeren Observer.

mijn view met tekstvelden:
[code=java]
public class RGBTextView extends LinearLayout implements Observer {

ColorModel model;
EditText rood;
EditText groen;
EditText blauw;


public RGBTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public void setModel(ColorModel model)
{
this.model = model;
}
public void init()
{
LayoutInflater inflater = (LayoutInflater)
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.textfield, this);

rood = (EditText) findViewById(R.id.roodText);
groen = (EditText) findViewById(R.id.groenText);
blauw = (EditText) findViewById(R.id.blauwText);
TextFieldListener listener = new TextFieldListener();
rood.setOnFocusChangeListener(listener);
groen.setOnFocusChangeListener(listener);
blauw.setOnFocusChangeListener(listener);

rood.setText("0");
groen.setText("0");
blauw.setText("0");
}
@Override
public void update(Observable observable, Object data) {
// TODO Auto-generated method stub
rood.setText(""+model.getRood());
groen.setText(""+model.getGroen());
blauw.setText(""+model.getBlauw());
}

public class TextFieldListener implements View.OnFocusChangeListener
{

@Override
public void onFocusChange(View arg0, boolean arg1) {
// TODO Auto-generated method stub
model.setRood(Integer.parseInt(rood.getText().toString()));
model.setGroen(Integer.parseInt(groen.getText().toString()));
model.setBlauw(Integer.parseInt(blauw.getText().toString()));
}

}
}
[/code=java]

En mijn model:
[code=java]
public class ColorModel extends Observable {
private int rood, groen, blauw;

public int getRood() {
return rood;
}

public void setRood(int rood) {
this.rood = rood;
setChanged();
notifyObservers();
}

public int getGroen() {
return groen;
}

public void setGroen(int groen) {
this.groen = groen;
setChanged();
notifyObservers();
}

public int getBlauw() {
return blauw;
}

public void setBlauw(int blauw) {
this.blauw = blauw;
setChanged();
notifyObservers();
}
}
[/code=java]

Nu is het probleem dat wanneer een tekstveld zijn focus verliest en dus de listener wordt aangeroepen alleen het tekstveld dat als eerst in de listener staat werkt. Bijvoorbeeld:

Ik voer in het eerste tekstveld (rood) 255 in. Daarna wissel ik van tekstveld. Achtergrond wordt rood.
Ik voer in het tweede tekstveld (groen) 255 in. Daarna wissel ik van tekstveld. Tekst in tekstveld springt terug op 0. Achtergrond blijft rood.

Als ik dan de listener aanpas naar:
[code=java]
public class TextFieldListener implements View.OnFocusChangeListener
{

@Override
public void onFocusChange(View arg0, boolean arg1) {
// TODO Auto-generated method stub
//model.setRood(Integer.parseInt(rood.getText().toString()));
model.setGroen(Integer.parseInt(groen.getText().toString()));
model.setBlauw(Integer.parseInt(blauw.getText().toString()));
}

}
[/code=java]

Nu werkt rood natuurlijk niet meer, groen wel, blauw niet. Ik heb echt geen idee hoe dit komt en hoop dat jullie kunnen helpen.

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Waar gebeurd het daadwerkelijk zetten van de achtergrondkleur?

Verder komt het initieel zetten van de textfields op 0 vreemd over i.c.m. het NIET zetten van de initiële waarden in/uit je model.

Ik zou ofwel aan het eind van je init() ofwel in je setModel() ook een update verwachten (of misschien wel in allebei, afhankelijk van de lifecycle).

[ Voor 69% gewijzigd door Herko_ter_Horst op 04-03-2013 19:00 ]

"Any sufficiently advanced technology is indistinguishable from magic."


  • ventilatorr
  • Registratie: Juli 2010
  • Laatst online: 11-11 21:57
De achtergrondkleur zit in een aparte class (van zijn view). Die heb ik niet geplaatst omdat hij werkt en hier verder niet relevant is.

Op de andere punten heb je gelijk. De setText was een snelle fix voor als een veld niet ingevuld was maar die moet natuurlijk uit het model komen.

  • cenix
  • Registratie: September 2001
  • Laatst online: 19:46
Kun je er eens met een debugger doorheen stappen? Ik vraag me echt af waarom je maar een model call kunt doen.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het lijkt me dat als je een debugger gebruikt, en een breakpoint op model.setRood zet, die regel uitvoerd, en naar de waardes in je velden kijkt, je zelf ook wel ziet wat er gebeurd. Daarnaast zie ik nogal wat code die maar weinig doet. M.a.w., in plaats van je te storten op design patterns, lijkt simpelweg debuggen mij handiger ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
ventilatorr schreef op maandag 04 maart 2013 @ 19:11:
De achtergrondkleur zit in een aparte class (van zijn view). Die heb ik niet geplaatst omdat hij werkt en hier verder niet relevant is.
Blijkbaar werkt ie niet... In elk geval is dat je debug-punt.

[ Voor 46% gewijzigd door Herko_ter_Horst op 04-03-2013 19:28 ]

"Any sufficiently advanced technology is indistinguishable from magic."


  • ventilatorr
  • Registratie: Juli 2010
  • Laatst online: 11-11 21:57
pedorus schreef op maandag 04 maart 2013 @ 19:18:
Het lijkt me dat als je een debugger gebruikt, en een breakpoint op model.setRood zet, die regel uitvoerd, en naar de waardes in je velden kijkt, je zelf ook wel ziet wat er gebeurd. Daarnaast zie ik nogal wat code die maar weinig doet. M.a.w., in plaats van je te storten op design patterns, lijkt simpelweg debuggen mij handiger ;)
Uit het debuggen blijkt ook dat groen en blauw 0 blijven. En tips over de code mag natuurlijk altijd.

Speciaal voor Herko ook de achtergrond view.
[code=java]
public class RGBColorView extends View implements Observer {
ColorModel model;

public RGBColorView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public RGBColorView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void setModel(ColorModel model)
{
this.model = model;
}

@Override
public void update(Observable arg0, Object arg1) {
setBackgroundColor(Color.rgb(model.getRood(), model.getGroen(), model.getBlauw()));
}
}
[/code=java]

  • pedorus
  • Registratie: Januari 2008
  • Niet online
ventilatorr schreef op maandag 04 maart 2013 @ 19:41:
Uit het debuggen blijkt ook dat groen en blauw 0 blijven.
Blijven ze dat of worden ze het? Ik zou er doorheen stappen (step into) om te kijken wat er nu gebeurd. Of kijken naar de waarde van blauw.getText() voor en na de aanroep van model.set*().

En tsja, hoeveel code is er nu eigenlijk echt nodig om één kleurtje bij te houden... ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • ventilatorr
  • Registratie: Juli 2010
  • Laatst online: 11-11 21:57
Hij begint op 0 en blijft het. Alleen rood veranderd.

En er komen meer views die bij de data moeten. Het is een schoolopdracht waarbij je MVC moet gebruiken :)

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dat laatste had ik al het vermoeden van. ;)

Maar je moet natuurlijk niet verbaasd zijn als je 0 invult in een vakje, en dat de kleur dan 0 blauw bevat. Ik bedoel, dan maakt dat andere probleempje waarom de niet als eerste gezette waardes in het model 0 blijven verder niet meer uit. Dus om te debuggen moet je natuurlijk eerst iets anders invullen in het tekstvakje voor blauw, en dan de focus veranderen.. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • ventilatorr
  • Registratie: Juli 2010
  • Laatst online: 11-11 21:57
Dat heb ik natuurlijk ook gedaan:)

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Als blauw.getText() op 0 begint terwijl je zojuist iets anders hebt ingevuld, dan moet je misschien proberen erachter te komen waarom dat komt. Misschien het breakpoint eerder zetten, kijken of de ids kloppen, e.d...

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • ventilatorr
  • Registratie: Juli 2010
  • Laatst online: 11-11 21:57
in de init komt er ''0'' in te staan, na setRood wordt de update aangeroepen dus staat blauw op 0.

EDIT: dat sloeg nergens op 8)7

[ Voor 14% gewijzigd door ventilatorr op 04-03-2013 20:57 ]


  • shdx
  • Registratie: November 2009
  • Laatst online: 20:08
Wat gebeurt er als je in het tekstveld 'blauw' een getal typt en dan de focus wisselt? Loop even mee door de code:
  1. De onFocusChange method in de TextFieldListener wordt aangeroepen
  2. model.setRood() wordt aangeroepen
  3. de setRood() method zegt dat er wat veranderd is en informeert zijn observers: notifyObservers
  4. de update method in RGBTextView wordt aangeroepen
  5. de update method zet de waardes van de text editors naar de waardes in het model
  6. model.blauw is nog altijd 0 in het model, omdat onFocusChange nog niet verder dan rood is gekomen
  7. het tekstveld krijgt dus weer 0 als waarde
  8. onFocusChange gaat verder met model.setBlauw() --> dat is nu weer 0
Pagina: 1