Switch Schieber von einer andere View kommend

C

cqp

Neues Mitglied
0
Hi,

ich habe mir einen Switch Schieber gebastelt, der passt auch soweit, wenn die App startet, steht er auf Ein, so wie ich es auch programmiert habe.
Aber wenn ich dann auf einen Button klicke und in eine neue View reinkomme und dann auf den zurück Button klicke auf dem Smartphone, steht der auf aus, obwohl in der neuen View nix mit dem Wert gemacht wird.

Ich denke mal, es liegt daran wie ich den Zurück Button programmiert habe?

Code:
    public boolean onKeyDown(int KeyCode, KeyEvent event) {
        
        if (KeyCode == KeyEvent.KEYCODE_BACK && mainIsOpen == false) {
            
            mainIsOpen = true;
            setContentView(R.layout.activity_main);
            return true;
        }
        
        return super.onKeyDown(KeyCode, event);
    }
Ich würde es ja noch verstehen, wenn der "Switch" wieder auf den Wert gesetzt wird, den er beim Starten der App hat. Es ist auch egal ob der er auf Ein oder Aus steht, wenn ich in eine neue View gehe und wieder zurück komme, steht er immer auf aus. Ich würde es gerne so haben, dass er immer so steht wie er zu letzt stand...

Jemand eine Idee?

Danke :)

EDIT: Gerade noch mal ausprobiert, jetzt klappts nur ganz sporadisch, dass er mir den richtigen Wert gibt!?!

Code:
alarmsw = (Switch) findViewById(R.id.sAlarm);
        
        alarmsw.setChecked(true);
        
        alarmsw.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if(isChecked){
                     alarm = true;
                    }else{
                     alarm = false;
                    }            
            }
            
            
        });
Code:
        if(v.getId() == R.id.bExit){
               
            //System.exit(0);
            
            System.out.println(alarm);

        }
Wenn ich auf den Button klicke, gibts mir den aktuellen Wert von "alarm" aus. Manachmal funktioniert das und manchmal nicht!? Dann kann ich schieben wie ich will, aber der Wert bleibt immer gleich wenn ich auf den Button klicke....

EDIT2: Ok das Edit habe ich jetzt selbst gelöst :biggrin:

Code:
        if(alarmsw.isChecked()){
               alarm = true;
              }
              else {
               alarm = false;
              }
       
    }

Wenn ich die App starte kann ich es hin-und her switchen und der Wert ändert sich auch immer.

Aber wenn ich von einer anderen View zurück komme, dann kann ich zwar noch hin und her schiebe aber der Wert ändert sich nicht. Ich denke mal das liegt daran, dass ich dann nicht mehr in der onCreate Methode drin bin wenn ich aus einer anderen View komme? Und deswegen der COde da drin nicht beachtet wird?
 
Zuletzt bearbeitet:
Deine Beschreibung des Problems ist sehr vage. Startest du eine neue Activity, oder veränderst du nur das Layout deiner Activity?
 
Ok dann versuche ich es einmal genauer.

Ich habe nur eine Activity. (Dazu gleich mal eine Frage, wann macht es denn Sinn eine neue Activity zu schreiben?) In dieser Activity frage ich mit "public void button Clicked(View v)" meine Buttons ab, die ich in meiner main.xml habe.
Da gibt es 3 Buttons, wenn diese geklickt werden öffnet sich eine neue view, also eine neue xml. In 2 Fällen wird nur etwas angezeigt und man kann nix machen außer lesen. Im anderen Fall kann man Zahlen eingeben und dann mit einem Klick auf einen weiteren Button rechnen.
Wenn ich aus diesen 3 Views wieder zurück möchte, klicke ich auf den Zurück Button des Smartphones, als kein selbstgebauter Zurück-Button.
Dann komme ich auch wieder in meine main.xml, wo auch der An/Aus Switch ist. Allerdings steht er dann auf aus wenn ich über die zurück-Taste komme. Auch wenn er vorher noch auf ein stand.

Wenn ich jetzt wieder auf Ein schalte, stellt er sich auch auf ein, aber meine Variable alarm wird nicht mehr auf true gesetzt, sie bleibt jetzt für immer auf false. Erst wenn ich die App wieder komplett neustarte kann ich in der main.xml den Schieber hin und her schieben und es ändert sich auch die Variable alarm. Wenn ich dann aber eine von den 3 Buttons klicke und mit dem Zurück wieder in die main zurückkehre, steht der Schieber wieder auf Aus und auch wenn ich ihn betätige wird die Variable nicht mehr geändert!

Meine Vermutung liegt darin, dass mein Code für den Schieber in der oncreate der mainactitvity liegt und wenn ich über den zurück knopf wieder in die main komme, wird diese methode nicht mehr ausgeführt und somit kann sich die variable nicht ändern?

Ich hoffe jetzt kommt es etwas klarer rüber.
 
Ganz einfach.

Neue Class anlegen namens Global.

Da rein gehen und
public static boolean switch = false;

dann gehste in deiner MainActivity.java in die oncreate routine.

Code:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
name_des_switches_in_android id_des_steuerelementes = (name_des_switches_in_android)findViewById(R.id.id_des_steuerelementes );

if (!Global.switch){
id_des_steuerelementes.checked = false (oder so musste mal gucken wie die anweisung heißt damit das makiert ist oder nicht)
}else{
id_des_steuerelementes.checked = true(oder so musste mal gucken wie die anweisung heißt damit das makiert ist oder nicht)
}
}
Und wenn der switch angeklickt wird musst du den status an Global.switch = true oder false übergeben.
kannste ja bei android:onclick kannst du ja den aktuellen status des switches abfragen
 
Zuletzt bearbeitet:
Ich bitte darum kukuk s Rat nicht zu befolgen! Hässliche geht es gar nicht.

Du musst mit dem activity lifecycle arbeiten, bzw mit on paus und on resume...

Lg. Dagobert

Gesendet von meinem GT-I9300 mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: markus.tullius
Ich habs jetzt so gelöst, dass ich in dem Code abfrage, ob alarm true oder false ist.


Code:
public void Schieber() {

alarmsw = (Switch) findViewById(R.id.sAlarm);
        
        if (alarm == true) {
            
            alarmsw.setChecked(true);
        }
        
        if (alarm == false) {
            
            alarmsw.setChecked(false);
        }

        alarmsw.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if(isChecked){
                     alarm = true;
                    }else{
                     alarm = false;
                    }            
            }

        });
        
        if(alarmsw.isChecked()){
               alarm = true;
              }
              else {
               alarm = false;
              }
    }
Und wenn ich in einer anderen View bin und zurück gehe wird Schieber() einfach erneut aufgerufen.

Code:
    public boolean onKeyDown(int KeyCode, KeyEvent event) {
        
        if (KeyCode == KeyEvent.KEYCODE_BACK && mainIsOpen == false) {
            
            mainIsOpen = true;
            setContentView(R.layout.activity_main);
            Schieber();
            
            return true;
        }
        
        return super.onKeyDown(KeyCode, event);
    }
Ist das in Ordnung so!? Funktionieren tut es auf jeden Fall :laugh:
 
Wenn es funktioniert, mache es so. Sieht gut aus. :)

Und am besten du streicht den Rat von @kukuk komplett aus deinem Gedächtnis. Das ist wirklich ein gutes Beispiel, wie man es niemals machen sollte.
 
Und warum sollte man das so nicht machen?

1. Es funktioniert
2. Führt zu keinerlei Fehler
3. Ist für jeden nachvollziehbar und total simpel!

Ich versteht nicht was ihr gegen diese Lösung habt.....
 
OOP.

Du müllst dein Code zu, und erhöhst das Risiko für Abstürze. Außerdem ist so ein Hack bei größeren Projekten mit mehreren Entwickler nicht wartbar. Als Betroffener bekommt dann schnell das Verlangen in den Tisch zu beißen. ;)

Anders gesagt, wer so programmiert, hat normalerweise den Überblick über seine Programmstruktur verloren. Und versucht nun an Werte zu kommen, die er vorher aus guten Gründen gekapselt hat.

Ohne dir etwas zu wollen, besorge dir bitte ein einführendes Buch über OOP und Java, und mache dich mit den grundlegenden Konzepten von Java vertraut. Und dazu gehört eben auch die Kapselung von Code.

Pointer und GOTO würde unter Java auch funktionieren, aber man benutzt sie trotzdem nicht. ;)
 

Ähnliche Themen

D
  • Data2006
Antworten
14
Aufrufe
545
jogimuc
J
A
Antworten
10
Aufrufe
1.029
swa00
swa00
S
Antworten
17
Aufrufe
567
jogimuc
J
Zurück
Oben Unten