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

Invoke Android ChangeListener door manuele switch.toggle()?

Pagina: 1
Acties:

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
Ik ben een Android App aan het maken waarin een switch een LinearLayout eronder laat zien. By default staat deze switch op "Off" en is de linearview eronder verborgen. Gezien de method waarnaar de switch refereed niet wordt gebruikt bij het opstarten heb ik de in de xml dit gedaan:
code:
1
android:layout_height="0dp"
. Vervolgens laat ik de methode CustomOnCheckedChangeListener als volgt naar mijn Switch luisteren:
code:
1
mySwitch.setOnCheckedChangeListener(new CustomOnCheckedChangeListener(findViewById(R.id.my_view)));

En de CustomOnCheckedChangeListener ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CustomOnCheckedChangeListener implements CompoundButton.OnCheckedChangeListener {
    private final View[] mViews;

    public CustomOnCheckedChangeListener(View... views) {
        mViews = views;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        for (View v : mViews) {
            LinearLayout layout = (LinearLayout) v;
            if (isChecked) {
                Animation anim = expand(layout, true);
                layout.startAnimation(anim);
            } else {
                Animation anim = expand(layout, false);
                layout.startAnimation(anim);
            }
        }
    }
}


Dit werk allemaal top, maar nu wil ik iets nieuws doen. Wanneer deze view een id ontvangt wil ik de switch op "On" zetten en de corresponderende view laten zien. Dus ik doe een simpele toggle van mijn switch:
code:
1
mySwitch.toggle();
De switch wordt nu wel omgezet, maar de method wordt niet aangezwengeld en dus wordt de LinearLayout eronder niet laten zien.

Ik heb geprobeerd de layout_height geprobeerd op "wrap_content" te zetten vanuit de java code, maar helaas bestaat er geen setLayoutHeight method in een LinearLayout.

Heeft iemand enig idee hoe ik deze method kan aanroepen op het moment dat ik de switch toggle()? Of weet iemand hoe ik deze method manueel éénmaal kan aanroepen? Alle tips zijn welkom!

ps. Ik wilde nog [Android] voor mn titel zetten, maar ik kan mn title nu niet meer veranderen.. :'(

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Zoiets?

code:
1
2
3
4
5
6
7
myCheckedChangeListener = new CustomOnCheckedChangeListener(findViewById(R.id.my_view))
mySwitch.setOnCheckedChangeListener(myCheckedChangeListener);

... 

mySwitch.toggle();
myCheckedChangeListener.onCheckedChanged(mySwitch, mySwitch.checked()) ;


Maar mooier is de code uit de onCheckedChanged in een aparte methode halen, en deze door zowel vanuit onCheckedChange als na manuale toggle uitvoeren.

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
@EddoH

Helaas werkt geen van beide suggesties. Ik zoals je aan het einde van je antwoord suggereerde ook de volgende code uit de CustomOnCheckedChangeListener gehaald en die in een aparte toggleAnimation gezet:
code:
1
2
3
4
5
6
7
8
9
10
private void toggleAnimation(View v, boolean isChecked) {
    LinearLayout layout = (LinearLayout) v;
    if (isChecked) {
        Animation anim = expand(layout, true);
        layout.startAnimation(anim);
    } else {
        Animation anim = expand(layout, false);
        layout.startAnimation(anim);
    }
}


Dit roep ik dan weer aan met een
code:
1
toggleAnimation(findViewById(R.id.my_view), true);
maar ook dat doet niets. Ik heb deze code binnen de onResume staan, wat volgens mij ook klopt, en verder heb ik geen idee waarom dit niet zou werken. Heeft iemand nog een goede tip?

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Misschien even debuggen? De code die ik postte zal de CustomOnCheckedChangeListener.onCheckedChanged echt wel aanroepen, het probleem zit dus in de code die je daarin gebruikt.

Wat doet expand()? Werkt het de eerste keer wel? Step, step into, watches, logcat etc

Sowieso loop je in je eerste voorbeeld door meerdere views, waarom in je tweede maar 1?

[ Voor 14% gewijzigd door EddoH op 08-10-2013 16:43 ]