Text in editText abspeichern und auslesen

  • Antworten:30
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 02:02:46 via Website

Hallo,
ich bin gerade dabei eine App zu erstellen womit ich Texte abspeichern und beim nächsten app start auslesen kann. Wie kann ich es machen, dass meine App die Texte in den einzelnen editText Elemente abspeichert und beim nächsten start ausliest? Ich habe schon etwas fertig gemacht. Aber es passiert nichts wenn man auf den Speichern Button drückt. Unten ist noch die LogCat.

Die .java:

import android.app.Activity;

import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;

public class Montag extends Activity implements OnClickListener {

CheckBox checkBox;
EditText editText;
Button button;
SharedPreferences sp;//hier verändert

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_montag);

    checkBox = (CheckBox) findViewById(R.id.checkBox);
    editText = (EditText) findViewById(R.id.editText);
    button = (Button) findViewById(R.id.buttonspeichern);
    button.setOnClickListener(this);

    sp=getSharedPreferences("myPrefs",0);//hier verändert

    loadSavedPreferences();
}

private void loadSavedPreferences() {

    boolean cbValue = sp.getBoolean("CHECKBOX", false);
    String name = sp.getString("NAME", "YourName");
    if (cbValue) {
        checkBox.setChecked(true);
    } else {
        checkBox.setChecked(false);
    }

    editText.setText(name);
}

private void savePreferences(String key, boolean value) {
    SharedPreferences.Editor edit = sp.edit();//hier verändert
    edit.putBoolean(key, value);
    edit.commit();
}

private void savePreferences(String key, String value) {
    SharedPreferences.Editor edit = sp.edit();//hier verändert
    edit.putString(key, value);
    edit.commit();
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    savePreferences("CHECKBOX", checkBox.isChecked());
    if (checkBox.isChecked())
        savePreferences("NAME", editText.getText().toString());


}

}

LogCat:

07-31 04:42:35.551      324-355/system_process E/Genymotion﹕ Could not open '/sys/class/power_supply/genymotion_fake_path/present'

07-31 04:42:39.867 459-1566/com.android.inputmethod.latin E/ActivityThread﹕ Failed to find provider info for com.android.inputmethod.latin.dictionarypack
07-31 04:42:39.875 459-1566/com.android.inputmethod.latin E/BinaryDictionaryGetter﹕ Could not find a dictionary pack
07-31 04:42:40.551 324-355/system_process E/Genymotion﹕ Could not open '/sys/class/power_supply/genymotion_fake_path/present'
07-31 04:42:45.555 324-355/system_process E/Genymotion﹕ Could not open '/sys/class/power_supply/genymotion_fake_path/present'
07-31 04:42:50.555 324-355/system_process E/Genymotion﹕ Could not open '/sys/class/power_supply/genymotion_fake_path/present'

Liebe Grüße

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2015, 08:57:29 via App

Hallo Fatih La ViiVaa!
Herzlich wilkommen hier im Forum :)



Was soll denn passieren?
Auf Buttonclick spricherst du den aktuellen Wert ab. Da wird dir nix angezeigt etc. vlt. kqnnst du da ja mal nen Toast oä. hinmachen.
Und donst sieht dein Code in Ordnung aus. Wenn du nach dem speichern die App neu startest steht dnn nicht der passende Wert drinne?

Bzgl LogCat das sind nur Systemmeldungen die nicht deine Ap betreffen.

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Sven R.
  • Forum-Beiträge: 1.904

02.08.2015, 09:43:13 via App

Wenn die Werte nicht gespeichert werden, dann probier mal

PreferenceManager.getDefaultSharedPreferences(Context)

Wenn du nicht mehrere einzelne SharedPreferences Dateien brauchst, funktioniert das gut.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 11:21:18 via Website

Erst mal danke für die Hilfe.

Pascal P.
Nein der gespeicherte wert steht dann nicht im edittext. Was ich mit dem Button klick meinte ist, es ist egal ob ich drauf drücke oder nicht beim nächsten app start ist es wie vorher bzw. der gespeicherte wert steht nicht in dem edittext.

Sven R.
Ich glaube das würde nicht klappen muss ca. 49 verschiedene Texte abspeichern.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 11:23:46 via Website

Aber die App stürzt auch nicht ab?
Lädst du denn in der onResume die Daten wieder in die EditTexts? Oder startest du die App/Activity immer komplett neu, sonst wird die onCreate ja nicht aufgerufen, sondern nur die onResume.

— geändert am 02.08.2015, 11:24:49

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 11:34:32 via Website

Wie jetzt dafür ist doch loadSavedPreferences();zuständig oder?

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 11:40:33 via Website

Ja aber die rufst du ja nur in der onCreate auf. Wenn du die App über den HomeButton beendest und dann über die zuletzt geöffneten Apps wieder startest wird die onCreate gar nicht aufgerufen sondern nur die onResume.
Siehe Hier um zu schauen, wann onCreate/onResume aufgerufen wird. Nur wenn die App/Activity wirklich beendet wurde und nicht noch im Cache liegt, wird die onCreate aufgerufen. Ich weiß aber nicht, ob das jetzt das Problem ist.

Du könntest auch wie Pascal gesagt hat mit Toasts deine App "debuggen" (oder mit dem richtigen Debugger) um zu gucken, ob die/beide savePreferences überhaupt aufgerufen wird.

— geändert am 02.08.2015, 11:44:16

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2015, 11:50:02 via Website

Fatih La ViiVaa

Sven R.
Ich glaube das würde nicht klappen muss ca. 49 verschiedene Texte abspeichern.

Doch du musst dann hatl immer einen anderen Key nehmen und nicht eine andere SharedPrefs Datei. Das mit den multiplen Keys macht sogar mehr sinn als mit mehreren Prefs

Und damit die App wirklich neu gestartet wird, musst du sie beenden und dann aus den "Recents" löschen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 11:51:27 via Website

Ich habe im Onclick finish() eingesetzt um zu gucken ob der Button überhaupt reagiert. Nach dem klick auf den Button hat sich nichts getan also speichert er ja erst garnicht? oder mache ich jetzt etwas falsch?

 @Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    savePreferences("CHECKBOX", checkBox.isChecked());
    if (checkBox.isChecked())
        savePreferences("NAME", editText.getText().toString());

    finish();
}

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 11:54:24 via Website

Also geht er gar nicht in die onClick.
Hast du den richtigen Button aus der richtigen xml-Datei in der onCreate initialisiert?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2015, 11:55:46 via Website

Theoretisch müsste es funktionieren, obwohl ich nicht viel von in Activitiies implementieren Listenern halte.
Kannst es auch mal so versuchen:

button.setOnClickListener(new View.OnClickListener() {

          @Override

          public void onClick(View v) {

             //Deine Aktionen finish und Speichern etc...

          }

      });

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 12:07:58 via Website

Lars F.
Soweit ich weiß ja ich habe es gerade nochmal kontrolliert es müsste so eigentlich alles stimmen.

Pascal P.
Das klappt nicht

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 12:14:05 via Website

Pascals Lösung müsste aber eigentlich klappen, was kommt für eine Meldung, was klappt da nicht?
Also Pascals Code musst du anstelle von buttons.setOnClicklistener(this) setzen.

— geändert am 02.08.2015, 12:19:52

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 12:29:00 via Website

Sry aber ich verstehe es nicht so ganz. Also wie soll ich jetzt vorgehen?

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 12:31:03 via Website

In der onCreate statt

button.setOnClickListener(this);

Pascal seinen Code einfügen und mit deinen Aktionen wo //Deine Aktionen finish und Speichern etc... steht ergänzen.

— geändert am 02.08.2015, 12:31:13

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 12:39:47 via Website

So habe ich es jetzt gemacht:

public class Montag extends Activity implements OnClickListener {

CheckBox checkBox;
EditText editText;
Button button;
SharedPreferences sp;//hier verändert

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_montag);

    checkBox = (CheckBox) findViewById(R.id.checkBox);
    editText = (EditText) findViewById(R.id.editText);
    button = (Button) findViewById(R.id.buttonspeichern);
    button.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            // TODO Auto-generated method stub
            savePreferences("CHECKBOX", checkBox.isChecked());
            if (checkBox.isChecked())
                savePreferences("NAME", editText.getText().toString());

            finish();

        }

    });

    sp=getSharedPreferences("myPrefs",0);//hier verändert

    loadSavedPreferences();
}

bei public class Montag extends Activity implements OnClickListener {ist jetzt aber ein fehler dort steht: "class ´montag´ must either be declared abstract or implement abstract method onClick(view) in onClickListener"

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 12:52:00 via Website

Dann musst du auch das implements onClickListener oben wegnehmen.

Ich hab das jetzt mal genauso nachgestellt und bei mir funktioniert es einwandfrei. Wenn Checkbox checked ist speichert er den Wert, wenn nicht dann nicht:
Kannst ja mal vergleichen. Oder cleane mal dein Projekt, vielleicht stimmt ja irgendwas mit den IDs nicht.

    package c.myapplication;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity  extends Activity implements View.OnClickListener {
CheckBox checkBox;
EditText editText;
Button button;
SharedPreferences sp;//hier verändert

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    checkBox = (CheckBox) findViewById(R.id.checkBox);
    editText = (EditText) findViewById(R.id.editText);
    button = (Button) findViewById(R.id.buttonspeichern);
    button.setOnClickListener(this);

    sp = getSharedPreferences("myPrefs", 0);//hier verändert

    loadSavedPreferences();
}

private void loadSavedPreferences() {

    boolean cbValue = sp.getBoolean("CHECKBOX", false);
    String name = sp.getString("NAME", "YourName");
    if (cbValue) {
        checkBox.setChecked(true);
    } else {
        checkBox.setChecked(false);
    }

    editText.setText(name);
}

private void savePreferences(String key, boolean value) {
    SharedPreferences.Editor edit = sp.edit();//hier verändert
    edit.putBoolean(key, value);
    edit.commit();
}

private void savePreferences(String key, String value) {
    SharedPreferences.Editor edit = sp.edit();//hier verändert
    edit.putString(key, value);
    edit.commit();
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "geht in onClick", Toast.LENGTH_SHORT).show();
    savePreferences("CHECKBOX", checkBox.isChecked());
    if (checkBox.isChecked())
        savePreferences("NAME", editText.getText().toString());
}

}

XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New CheckBox"
    android:id="@+id/checkBox" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editText" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save"
    android:id="@+id/buttonspeichern" /></LinearLayout>

— geändert am 02.08.2015, 12:54:21

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 14:48:12 via Website

ich verstehe es nicht es geht nicht habe alles gemacht wie du es speicher einfach nicht ab.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 14:50:14 via Website

Mach mal folgendes:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkBox = (CheckBox) findViewById(R.id.checkBox);
        editText = (EditText) findViewById(R.id.editText);
        button = (Button) findViewById(R.id.buttonspeichern);
        button.setOnClickListener(this);
    }
@Override
    protected void onResume() {
        // TODO Auto-generated method stub

        sp = getSharedPreferences("myPrefs", 0);//hier verändert

        loadSavedPreferences();
    }

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 14:59:19 via Website

habe ich gemacht. Hat sich aber nichts geändert. Ich erstelle jetzt erst mal ein ganz neuen Projekt und versuche es mal dort.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 15:02:46 via Website

Ja ich finde es auch sehr komisch.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2015, 15:10:17 via Website

Ich vermute dass das ganze mit dem Prefereces bzw. dem Preferences Manager zusammenhängt. Ich würde wirklich einfach dei Standart Prefs benutzen und die Keys variieren oder gleich auf eine DB umsteigen falls es später komplizierter wird mit den ganzen Einträgen.

Sven R.

Wenn die Werte nicht gespeichert werden, dann probier mal

PreferenceManager.getDefaultSharedPreferences(Context)

Wenn du nicht mehrere einzelne SharedPreferences Dateien brauchst, funktioniert das gut.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 15:17:31 via Website

Aber bei mir hat es ja auch funktioniert, wobei ich auch zu den Standart Preferences raten würde. Ich hatte eher vermutet, dass die IDs irgendwie durcheinander gekommen sind, weil er ja gar nicht erst in die onClick gekommen ist.

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 16:28:08 via Website

Okay es funktioniert aber nur dann wenn ich alles in dem erst erstellen .java und xml rein packe. Wie geht es denn wenn ich es in verschiedenen layouts speichern und auslesen will?

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 17:14:39 via App

Du hast mehrere Layout Files aber zeigst doch nur eins an?

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

02.08.2015, 17:21:40 via Website

Und wo und vor allem wie zeige ich die anderen layouts an. Weil jeder layout hat ja seinen eigenen .java. Muss ich es trotzdem in dem ersten angeben?

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

02.08.2015, 23:27:51 via App

Wenn du für jedes Layout eine eigene Java hast musst du diese erst mit einem intent starten. Wenn die aber keine eigene activity brauchen kannst du auch nur ein setcontentview mit dem anderen Layout aufrufen.

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

03.08.2015, 00:56:20 via Website

Habe es so gemacht:

Intent myIntent1 = new Intent(planapp.this, MainActivity.class);
                myIntent1.putExtra("layout", R.layout.activity_main);
                startActivity(myIntent1);

so stürzt es aber ab. Kennst du vielleicht eine bessere Lösung?

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

03.08.2015, 08:14:25 via App

Du rufst also die MainActivity von einer anderen Activity auf?
Dann musst du dieses putExtra weglassen und in der MainActivity einfach setContentView(activity_Main) setzen.

— geändert am 03.08.2015, 08:14:45

Antworten
Fatih La ViiVaa
  • Forum-Beiträge: 13

04.08.2015, 00:32:43 via Website

Trotzdem stürzt die App ab. Ist es denn so richtig?
Intent myIntent1 = new Intent(planapp.this, MainActivity.class);
setContentView(R.layout.activity_main);
startActivity(myIntent1);`

Antworten
Sven R.
  • Forum-Beiträge: 1.904

04.08.2015, 08:03:22 via App

Nein, er meinte sicherlich, dass du die Activity startest und innerhalb dieser Activity in der onCreate setContentView() machst.

— geändert am 04.08.2015, 10:35:51

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten