Werte von Radiobuttons in andere Activitys übernehmen

L

Lerncoach

Neues Mitglied
0
Hallo,
ich bin noch recht neu in der Programmierung von Android und schreibe gerade meine erste App. Ich habe zwar Erfahrung mit Basic aber stelle immer wieder fest, das Java ne ganz andere Hausnummer ist.
Folgendes Problem: ich habe eine App mit einem Viewflipper mit einfachen Textfeldern. Beim blättern durch die Textviews wird jedesmal ein Sound abgespielt, den man auch deaktivieren kann. Dazu habe ich eine eigene Activity erstellt mit 2 Radiobuttons (AN und AUS). Also eigentlich ganz simpel. Jetzt will ich den Status der Radiobuttons in eine andere Activity übernehmen, um dort den Sound zu unterdrücken bzw. zu erlauben. Und da liegt das Problem. Wie kann man den Wert einer Variablen in einer anderen Activity weiter verwenden? Ich habe schon einen Tag lang mehrere Methoden aus sämtlichen Foren und Tutorials probiert und nichts hat geklappt. Ich will nur eine einfache Abfrage auf true oder false. :cursing:
Hier ist der Code des Menüs mit den Radiobuttons:

HTML:
public class einstellungen extends ActionBarActivity {


    public boolean sound;

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

        final RadioButton sound_an =(RadioButton)findViewById(R.id.radioButton1);
        final RadioButton sound_aus=(RadioButton)findViewById(R.id.radioButton2);
        RadioGroup group=(RadioGroup) findViewById(R.id.radiogroup);

        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
        {

            public void onCheckedChanged(RadioGroup group, int checkedId)
            {
                if(sound_an.isChecked())
                {
                sound=true;
                }
                else if(sound_aus.isChecked())
                {
                sound=false;
                }
            }
        });

    }
Und das ist der Codeteil der anderen Activity, an dem die Variable den Mediaplayer freigeben soll:

HTML:
   @Override
        public boolean onFling (MotionEvent e1,MotionEvent e2, float velocityX, float velocityY){
            if (Math.abs(e1.getY()-e2.getY())>150)return false;
            if (e1.getX()-e2.getX()> SWIPE_MIN_DISTANCE
                    && Math.abs (velocityX)>SWIPE_THRESHOLD_VELOCITY && !zeigeAW)
            {
                viewf.setInAnimation(slideLeftIn);
                viewf.setOutAnimation(slideLeftOut);
                viewf.showNext();
                viewa.showNext();
                mp = MediaPlayer.create(unternehmensformen.this, R.raw.pageflip_02);
                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.release();
                    }
                });

                mp.start();
            }
            else if(e2.getX()-e1.getX()> SWIPE_MIN_DISTANCE
                    && Math.abs (velocityX)>SWIPE_THRESHOLD_VELOCITY && !zeigeAW)
            {
                viewf.setInAnimation(slideRightIn);
                viewf.setOutAnimation(slideRightOut);
                viewf.showPrevious();
                viewa.showPrevious();
                mp = MediaPlayer.create(unternehmensformen.this, R.raw.pageflip_02);
                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.release();
                    }
                });

                mp.start();
            }

            return false;

        }
Das dürfte doch überhaupt nicht schwer sein. Bitte um Eure Hilfe.:confused2:
 
Du kannst z.B. eine Klasse Globals anlegen, mit static Elementen.
public class Globals {
static ... wert;
}

In einerer Activity schreibst Du dann
Globals.wert = wert;
in der anderen
wert=Globals.wert;

Das ist vielleicht nicht professionell, aber es geht

Gruß
E.S.
 
Danke für die Antwort. Das mit den Globals habe ich auch schon versucht. Aber ich werde es nochmal mit Deiner Schreibweise probieren. In Basic muss man einfach eine Variable als public deklarieren und jedes Fenster kann daruf zugreifen. Warum geht das in einer so weit verbreiteten Sprache wie Java nicht?:thumbdn:
 
... Warum geht das in einer so weit verbreiteten Sprache wie Java nicht?:thumbdn:
Weil sonst schnell Chaos entstehen würde.

Das was ich vorgeschlagen habe, ist auch mit großer Vorsicht zu geniessen.
Es ist nur bei kleinen Programmen anwendbar, die man 100%-ig überblickt,
oder wenn man die globalen Variablen nur einmalig an einer Stelle festlegt
und ansonsten nicht mehr ändert.

Sage ich mal so gefühlsmäßig als Nichtprofi.
 
OK, das leuchtet natürlich ein. Aber so große Programme werde ich wohl in nächster Zeit nicht schreiben. Das mit den Globals scheint zu funktionieren. Ich kann die Variable allerdings nicht mit den Radiobuttons schalten. Wenn ich die Einstellungen öffne und die Radiobuttons umschalte, haben die beim nächsten Öffnen wieder ihren alten Zustand. Die Variable wird dabei auch nicht verändert. Das funktioniert nur, wenn ich von Hand einen anderen Wert eintrage. Wie bringt man die Radiobuttons dazu, das sie ihren Zustand speichern, wenn man die Activity schließt? Ich dachte, das pasiert so oder so?
 
Bäh.. Globals..
:D

Das einzige was ich so auf Anhieb als Global in einer eigenen Klasse definieren würde, wären Konstanten die sich niemals ändern.
Man sollte sich angewöhnen nach "public" immer "static final" zu setzen, ist in der mehrzahl der Fälle "richtiger" (bei Variablen, nicht bei Methoden natürlich).

Für deinen Anwendungsfall wären die SharedPreferences wohl eine gute Idee (Google hilft), denn dann kannst du den Wert auch speichern und er wird beim nächsten öffnen der App wieder gesetzt (und man muss den Sound nicht jedes neu "austellen").
 
Hallo,
danke für den Tip mit den SharedPreferences. Der Status der Radiobuttons bleibt jetzt auch nach dem schließen der App erhalten:thumbsup:
Die Globals habe ich wieder gelöscht. Allerdings habe ich jetzt Problem den Status der Radiobuttons in die andere Activity einzubinden. Wenn ich die antsprechenden Codezeilen zum Aufruf der SharedPreferences in die andere Activity schreibe, stürzt die App auf dem Handy ab. Was mache ich hier falsch?

Hier der Code der Radiobuttons aus den Einstellungen:

HTML:
public class einstellungen extends ActionBarActivity {

    private String settingsTAG = "SoundStatus";
    private SharedPreferences prefs;

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

        prefs = getSharedPreferences(settingsTAG, 0);

        final RadioButton rb1 = (RadioButton) findViewById(R.id.radioButton1);
        final RadioButton rb2 = (RadioButton) findViewById(R.id.radioButton2);

        rb1.setChecked(prefs.getBoolean("rb1", false));
        rb2.setChecked(prefs.getBoolean("rb2", true));
        Button btnSave = (Button) findViewById(R.id.btnsave);

        btnSave.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                prefs = getSharedPreferences(settingsTAG, 0);
                SharedPreferences.Editor editor = prefs.edit();

                editor.putBoolean("rb1", rb1.isChecked());
                editor.putBoolean("rb2", rb2.isChecked());
                editor.commit();

                finish();


            }
        });

    }
Und hier das Gegenstück aus der anderen Activity, das leider nicht funzt:

HTML:
@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_unternehmensformen);

            String settingsTAG = "SoundStatus";
            SharedPreferences prefs = getSharedPreferences(settingsTAG, 0);
            boolean rb1 = prefs.getBoolean("rb1", false);
Bestimmt irgendwas falsch geschrieben aber ich finde in den anderen Foren leider keine Lösung. Danke schonmal für Eure Hilfe.
 
Moin, das kann verschiedene Gründe haben. Zb die activity nicht richtig angemeldet, aufgerufen, ein Fehler im Layout..
Schwer aus der Entfernung da den Fehler zu finden :p
Variablen kannst du mittels "intents" an andere activities übergeben. "put extra" ist hier ein Stichwort.

Aber um deinen Fehler zu nennen: du legst erst eine variable private an, um sie dann mit einer public zu überschreiben (da namensgleich).

Kleiner Tipp: arbeite dich vielleicht mal etwas in den Debugger ein, eigentlich zeigt der solche schnitzer an :-D

Btw: wenn du dir etwas Arbeit sparen willst, verzichte auf die besagte Variable und schreibe gleich "settingsTAG" in den ersten Parameter von deinem getprefs Aufruf (settingsTAG dann mit Anführungszeichen, da sonst nicht als string erkannt).

Aber um die Wirkungsweise der Zugriffsbezeichner wirst auf kurz oder lang nicht drum herum kommen. ;-)

Der ursprüngliche Beitrag von 07:24 Uhr wurde um 07:42 Uhr ergänzt:

note3 schrieb:
Weil sonst schnell Chaos entstehen würde.
...
Es ist nur bei kleinen Programmen anwendbar, die man 100%-ig überblickt,
oder wenn man die globalen Variablen nur einmalig an einer Stelle festlegt
und ansonsten nicht mehr ändert.

Genau so ist es. Selbst wenn der Code nur aus 20 Zeilen aber 2 Klassen besteht, gibt es da ggf schon (wie hier) Überschneidungen, die man schnell mal übersieht.
 
Zuletzt bearbeitet:
Hallo,
irgendwie kome ich gerade nicht mit. So sieht jetzt mein Code für die Einstellungen aus:

HTML:
public class einstellungen extends ActionBarActivity {

    SharedPreferences prefs;


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

        prefs = getSharedPreferences("settingsTAG", 0);

        final RadioButton rb1 = (RadioButton) findViewById(R.id.radioButton1);
        final RadioButton rb2 = (RadioButton) findViewById(R.id.radioButton2);

        rb1.setChecked(prefs.getBoolean("rb1", false));
        rb2.setChecked(prefs.getBoolean("rb2", true));
        Button btnSave = (Button) findViewById(R.id.btnsave);

        btnSave.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                prefs = getSharedPreferences("settingsTAG", 0);
                SharedPreferences.Editor editor = prefs.edit();

                editor.putBoolean("rb1", rb1.isChecked());
                editor.putBoolean("rb2", rb2.isChecked());
                editor.commit();

                finish();


            }
        });

    }

In der anderen Activity muss ich bloß diese eine Zeile hinzufügen und die ganze App stürzt ab:

HTML:
SharedPreferences prefs = getSharedPreferences("settingsTAG", 0);

Wie kann man denn die SharedPreferences wieder aufrufen?

Der Debugger hat mir keinen Fehler angezeigt. Ich arbeite mit Android Studio und nicht mit Ecplise. Ich weiß nicht, ob das einen Unterschied macht.

mfG Coach
 
Hmm diese Version die sharedPreferences zu definieren habe ich noch nicht gesehen.

Hier ein Auszug aus meiner alten App:
Speichern:
Code:
  final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
   	  
   	  //Allgemein
   	  sp.edit().putString("Hersteller", Hersteller).commit();
   	  sp.edit().putString("Modell", Modell).commit();
   	  sp.edit().putString("Betriebssystem", Betriebssystem).commit();

Auslesen:
Code:
		  final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
		  //Allgemein
		  Hersteller = sp.getString("Hersteller","");
		  Modell = sp.getString("Modell","");
		  Betriebssystem = sp.getString("Betriebssystem","");
		  Gewicht = sp.getString("Gewicht","");
		  Preis = sp.getString("Preis","");

Versuch es mal mit der Definition.

LG
Xilent
 
Oh man. Jetzt habe ich hier schon drei verschiedene Versionen gesehen und keine hat bis jetzt funktioniert. Bei der letzten Lösung stürzt die App schon beim öffnen des Menüs ab. Ich habe es hinbekommen einen Viewflipper zu programmieren der auf Berührungen reagiert und mit Sounds usw. läuft. Aber einen einfachen Radiobutton kann man nicht abfragen? Das soll doch wohl ein schlechter Scherz sein. Hat vielleicht jemand ein komplettes Codebeispiel für mich? Langsam habe ich die Faxen hier echt dicke. Danke schonmal.

mfG Coach
 
Das Problem ist ja sicherlich nicht das abfragen ,sondern übergeben und das dauerhafte speichern, da du mehrere Activities hast die alle auf die Daten zugreifen wollen. Wer die Google Doku liest und versteht sollte da keine Probleme haben.
Außerdem versucht man dir zu helfen, da finde ich so eine Antwort unangemessen.

Wenn du mit Frustration nicht umgehen kannst, dann ist Android programmierung definitiv das falsche für dich.

Lg
Xilent
 
Zuletzt bearbeitet:
Ja, sorry, bin im Moment ziemlich im Stress. Ich mache das mit der App nebenbei und will die bald fertig kriegen. Das mit den Buttons ist das letzte, was noch fehlt. Dann werde ich erstmal weiter schauen. Aber danke für die Unterstützung. Ich rege mich ja nciht über Euch auf, sondern eher über mich, weil ich dieses einfache Problem nicht gelöst bekomme.

mfG Coach
 
Sooo nachdem du mir ja jetzt die komplette App geschickt hast habe ich den Fehler relativ schnell erkannt und es kommt wie es kommen musste --> 2 Zeilen Code am falschen Platz.

Hier der alte Code:
Code:
        public boolean zeigeAW                               =false;

        SharedPreferences prefs = getSharedPreferences("settingsTAG", 0);
        public boolean rb1 = prefs.getBoolean("rb1", false);


        private Animation       slideLeftIn;

Hier der neue:
Code:
        public boolean zeigeAW                               =false;

        SharedPreferences prefs;
        public boolean rb1;


        private Animation       slideLeftIn;
und in void onCreate();
Code:
            setContentView(R.layout.activity_unternehmensformen);

            prefs = getSharedPreferences("settingsTAG", 0);
            rb1 = prefs.getBoolean("rb1", false);

Hatte dasselbe Problem auch mal als ich mit sharedPreferences angefangen habe..
Du kannst sharedPreferences nicht vor dem Start der eigentlichen Activity definieren geschweige denn abrufen, da der PreferenceManager noch nicht geladen ist.

LG
Xilent

P.S: Hoffe die Frustration hat jetzt ein Ende :)
 
Wow, ja ich mache das hier jetzt seid 3 Wochen und lerne jeden Tag soviel dazu. Tausend Dank für den Hinweis. Also das Programm läuft jetzt zumindest schonmal. Allerdings bewirkt das schalten der Radiobuttons garnichts. Ich habe in der Activity "unternhemensformen" die Variable rb1 auf "true" abgefragt:

HTML:
 @Override
                public void onClick(View v) {

                    if(!zeigeAW){
                        button1.setText("zurück zur Frage");
                        fra.setVisibility(View.GONE);
                        anw.setVisibility(View.VISIBLE);
                        zeigeAW=true;
                        if(rb1==true) {
                            mp = MediaPlayer.create(unternehmensformen.this, R.raw.pageflip_04);
                            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                                @Override
                                public void onCompletion(MediaPlayer mp) {
                                    // TODO Auto-generated method stub
                                    mp.release();
                                }
                            });

                            mp.start();
                        }

Aber der Sound ist einfach immer an:lol:

oder muss ich das an anderer Stelle machen? Gibt es vielleicht sogar eine Möglichkeit, den Mediaplayer generell zu deaktivieren?
 
Hmm bei mir funktioniert das ohne Probleme:
Code:
  public void onClick(View v) {

                    if(!zeigeAW){
                        button1.setText("zurück zur Frage");
                        fra.setVisibility(View.GONE);
                        anw.setVisibility(View.VISIBLE);
                        zeigeAW=true;
                        Log.d("TEST RadioButton State", "rb1 = " + rb1);
                        if(rb1==true) {
                            mp = MediaPlayer.create(unternehmensformen.this, R.raw.pageflip_04);
                            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                                @Override
                                public void onCompletion(MediaPlayer mp) {
                                    // TODO Auto-generated method stub
                                    mp.release();
                                }
                            });

                            mp.start();
                        }

                        }else{
                        button1.setText("Lösung");
                        fra.setVisibility(View.VISIBLE);
                        anw.setVisibility(View.GONE);
                        zeigeAW=false;
                        if(rb1==true) {
                                mp = MediaPlayer.create(unternehmensformen.this, R.raw.pageflip_03);
                                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                                    @Override
                                    public void onCompletion(MediaPlayer mp) {
                                        // TODO Auto-generated method stub
                                        mp.release();
                                    }
                                });

                                mp.start();
                        }
                    }
                }

LG
Xilent
 
Hey, immer ganz ruhig. Keiner hat gesagt, dass es einfach ist eine App zu programmieren. Ich programmiere ausschließlich in den Semesterferien, da ich sonst keine Zeit habe, weil es einfach immer viel, viel nach zuschlagen gibt.
Also, dass du nicht direkt ans Ziel kommst ist normal, wenn dich das beruhigt. :)

Vielleicht mal unabhängig vom Code, frage dich mal was deine Anwendung machen soll (als Gesamtes und nicht jede Klasse einzeln). Gerade bei Android ist man dazu verleitet bedingt durch die Activities den Überblick über die Gesamtheit zu verlieren.

Schreibe dir vielleicht mal alle Variablen auf und überlege "was welche wo tun soll".
Oder "wann muss welche Einstellung wo bekannt sein". <- auch so eine typische Frage die potenzielle Fehlerquellen ausräumt.

Wie übergibst du derzeit deine rb1? Was soll diese tun?

PS: ich war selbst immer etwas enttäuscht, wenn jemand keinen Code bei seiner Antwort gibt, da ich dachte, dass die Antwort damit auch nicht groß weiterhelfen kann. Aber glaube mir, manchmal ist es sinnvoller sich Gedanken zu machen, als irgendwas zu copy-pasten. :D

Du bekommst das schon hin ;)
 
ui_3k1 schrieb:
Vielleicht mal unabhängig vom Code, frage dich mal was deine Anwendung machen soll (als Gesamtes und nicht jede Klasse einzeln). Gerade bei Android ist man dazu verleitet bedingt durch die Activities den Überblick über die Gesamtheit zu verlieren.
Wobei gerade die Activities dazu führen, dass man seinen Code und seine Funktionen wunderbar kapseln kann.
Für jede Funktion (bzw Aktivität ;)) gibt es eine Activity die (zumindest im Idealfall) komplett unabhängig von den anderen Activities ist.

Leider wird das heuzutage viel zu oft nicht gemacht.
 
  • Danke
Reaktionen: markus.tullius
amfa schrieb:
Wobei gerade die Activities dazu führen, dass man seinen Code und seine Funktionen wunderbar kapseln kann.
Für jede Funktion (bzw Aktivität ;)) gibt es eine Activity die (zumindest im Idealfall) komplett unabhängig von den anderen Activities ist.

Leider wird das heuzutage viel zu oft nicht gemacht.

Schon möglich. Versuche auch so viele Activities oder helper Klassen zu machen um Code auszulagern, leider klappt das nicht immer.. Habe in meiner App 45 Activities mit je 500 zeilen und eine MainAcitivity mit 2500 Zeilen, die sehr sehr unübersichtlich ist...

Machen auch nicht viele ist mehr Aufwand = kostet mehr geld :)
 
48939579.jpg
 
  • Danke
Reaktionen: Xilent

Ähnliche Themen

5
Antworten
22
Aufrufe
1.420
590239
5
R
  • RalfKahl
Antworten
10
Aufrufe
298
RalfKahl
R
D
Antworten
23
Aufrufe
2.537
Data2006
D
Zurück
Oben Unten