Speichern auf einen Tag im CalendarView

  • Antworten:25
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 11

23.04.2019, 10:27:14 via Website

Hallo zusammen,

in meiner App habe ich zwei Activities. Die MainActivity ist ein Kalender mit CalendarView. Wenn ich auf ein Datum klicke, öffnet sich die zweite Activity, welche eine Tabelle beinhaltet. Jetzt versuche ich die Tabelle auf den Tag im Kalender zu speichern. Ich habe es mit shared preferences probiert, doch da ist die Tabelle auf jeden Tag im Kalender gespeichert. Wenn ihr einen Tipp für mich hättet, wie ich das Problem lösen kann, wäre ich sehr dankbar.

Liebe Grüße

Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.479

23.04.2019, 11:02:43 via Website

Hallo Arno,

herzlich wilkommen hier im Forum :)


Spricht du von "der Tag" (im Sinne des Datums) oder von "Tag" im Sinne von Tagging?
Die begrifflichkeit ist hier nicht ganz klar.

Kannst du und mal konkret deinen Code zeigen?
Ohne diesen kommen wir schlecht weiter.
Z.b. weiß ich nicht, welchen Datentyp deine "Tabelle" hat und was denn das richtige Verhalten sein soll.

Falls du vorhast eine Art Terminkalender zu programmieren, nimm für die Termine o.ä. am besten eine SQLite DB anstatt shared preferences.

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

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11

23.04.2019, 11:32:56 via Website

Hallo Pascal,

vielen Danke für die schnelle Antwort. Ich meine schon den normalen Tag(day).;)
MainActivity:
public class MainActivity extends AppCompatActivity {
public static final String TAG= "MainActivity";
private CalendarView calendarView;

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

    calendarView = (CalendarView)findViewById(R.id.calendarView);
    calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
        @NonNull
        @Override
        public void onSelectedDayChange(CalendarView calendarView, int year, int month, int dayOfMonth) {

            String date = dayOfMonth + "." + (month + 1) + "." +year ;
            Log.d(TAG," dd.MMMM.yyyy:" + date);

            Intent intent = new Intent (MainActivity.this, Tabelle.class);
            intent.putExtra("DATE", date);

            startActivity(intent);
}
    });`

Tabelle:
public class Tabelle extends AppCompatActivity implements View.OnClickListener {

public static final String TAG = "Tabelle";
TextView theDate;

Button f21, f31, f41, f22, f23, f24, f25, f35, f26, f27, f28, f29, f210, f211, f36, f38, f37, f46, f48, btn_1_2;
String xo = "X";
int[][] MainActivityStorage;

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

    theDate = (TextView) findViewById(R.id.date);

    Intent incomingIntent = getIntent();
    String date = incomingIntent.getStringExtra("DATE");
    theDate.setText(date);

    btn_1_1 = findViewById(R.id.btn_1_1);
    btn_1_1.setOnClickListener(this);

//Tabellenprogrammierung//

    f21 = findViewById(R.id.field_2_1);
    f31 = findViewById(R.id.field_3_1);
    f41 = findViewById(R.id.field_4_1);
    f22 = findViewById(R.id.field_2_2);
    f36 = findViewById(R.id.field_3_6);
    f37 = findViewById(R.id.field_3_7);
    f23 = findViewById(R.id.field_2_3);
    f48 = findViewById(R.id.field_4_8);
    f46 = findViewById(R.id.field_4_6);
    f24 = findViewById(R.id.field_2_4);
    f211 = findViewById(R.id.field_2_11);
    f25 = findViewById(R.id.field_2_5);
    f35 = findViewById(R.id.field_3_5);
    f26 = findViewById(R.id.field_2_6);
    f27 = findViewById(R.id.field_2_7);
    f28 = findViewById(R.id.field_2_8);
    f29 = findViewById(R.id.field_2_9);
    f210 = findViewById(R.id.field_2_10);
    f38 = findViewById(R.id.field_3_8);

    f21.setOnClickListener(this);
    f31.setOnClickListener(this);
    f41.setOnClickListener(this);
    f22.setOnClickListener(this);
    f36.setOnClickListener(this);
    f48.setOnClickListener(this);
    f23.setOnClickListener(this);
    f37.setOnClickListener(this);
    f46.setOnClickListener(this);
    f24.setOnClickListener(this);
    f38.setOnClickListener(this);
    f25.setOnClickListener(this);
    f35.setOnClickListener(this);
    f26.setOnClickListener(this);
    f27.setOnClickListener(this);
    f28.setOnClickListener(this);
    f29.setOnClickListener(this);
    f210.setOnClickListener(this);
    f211.setOnClickListener(this);

MainActivityStorage =new int[11][11];

SharedPreferences sharedPreferences = getSharedPreferences("MyKey", 0);
f21.setText(sharedPreferences.getString("myKey1", ""));
f22.setText(sharedPreferences.getString("myKey2", ""));
f23.setText(sharedPreferences.getString("myKey3", ""));
f24.setText(sharedPreferences.getString("myKey4", ""));
f25.setText(sharedPreferences.getString("myKey5", ""));
f26.setText(sharedPreferences.getString("myKey6", ""));
f27.setText(sharedPreferences.getString("myKey7", ""));
f28.setText(sharedPreferences.getString("myKey8", ""));
f29.setText(sharedPreferences.getString("myKey9", ""));
f210.setText(sharedPreferences.getString("myKey10", ""));
f211.setText(sharedPreferences.getString("myKey11", ""));
f31.setText(sharedPreferences.getString("myKey12", ""));
f35.setText(sharedPreferences.getString("myKey13", ""));
f36.setText(sharedPreferences.getString("myKey14", ""));
f37.setText(sharedPreferences.getString("myKey15", ""));
f38.setText(sharedPreferences.getString("myKey16", ""));
f41.setText(sharedPreferences.getString("myKey17", ""));
f46.setText(sharedPreferences.getString("myKey18", ""));
f48.setText(sharedPreferences.getString("myKey19", ""));

}

@Override
protected void onStop() {
    super.onStop();

    SharedPreferences sharedPreferences = getSharedPreferences("MyKey", 0);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("myKey1", f21.getText().toString());
    editor.putString("myKey2", f22.getText().toString());
    editor.putString("myKey3", f23.getText().toString());
    editor.putString("myKey4", f24.getText().toString());
    editor.putString("myKey5", f25.getText().toString());
    editor.putString("myKey6", f26.getText().toString());
    editor.putString("myKey7", f27.getText().toString());
    editor.putString("myKey8", f28.getText().toString());
    editor.putString("myKey9", f29.getText().toString());
    editor.putString("myKey10", f210.getText().toString());
    editor.putString("myKey11", f211.getText().toString());
    editor.putString("myKey12", f31.getText().toString());
    editor.putString("myKey13", f35.getText().toString());
    editor.putString("myKey14", f36.getText().toString());
    editor.putString("myKey15", f37.getText().toString());
    editor.putString("myKey16", f38.getText().toString());
    editor.putString("myKey17", f41.getText().toString());
    editor.putString("myKey18", f46.getText().toString());
    editor.putString("myKey19", f48.getText().toString());



    editor.commit();
}

…..
und die Tabelle will ich auf den current day im Kalender speichern und dort dann auch aufrufen, wenn ich auf das Datum klicke. Im Moment ist die Tabelle auf jedem Tag(Day) gleich. Ich hoffe du hast mich jetzt einigermaßen verstanden. :)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

23.04.2019, 13:12:04 via Website

Hallo also ich kann in deinem Code irgend wo etwas erkennen wo du den String "date" benuzt, nachdem du ihn aus den Intent ausgelesen hast.

Wenn du den gar nicht benutzt wozu übergibs du ihn denn von der Main an die zweite activity?

Wie sieht eigentlich deine onClick Methode aus benutzt du da wenigstens den String?
Speicherst da wenigstens die neuen Werte in deiner Tabelle?

Wie gesagt in dem uns gezeigten Code ist nichts wo etwas neues in den Prefs speicherts.
Da du die Werte nicht änderst nutzt es dir auch nichts wenn du die vermeintlichen neuen Werte in der onStop Methode am Ende in die Pref speicherst. Das sind ja noch die gleichen wie du sie am Anfang der Activity in der onCreate aus den Prefs gelesen hast . Verändert hast du sie nicht, zu mindestens können wir das nicht sehen.

— geändert am 23.04.2019, 14:21:58

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11

23.04.2019, 14:16:13 via Website

Ich hab den String doch bei der TabellenActivity benutzt :

Intent incomingIntent = getIntent();
String date = incomingIntent.getStringExtra("DATE");
theDate.setText(date);

-> theDate ist ein TextView über meiner Tabelle. Dort wird mir das Datum, welches ich im CalendarView angeklickt habe angezeigt

Bei onClick ist nur, dass wenn ich auf einem meiner Button klicke, im Button ein x gesetzt wird bzw. wenn ein x schon im Button ist, dass ich den wieder rausnehme.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

23.04.2019, 14:39:53 via Website

ok wenn dir das übergebene Datum in der TextView angezeigt wird wo ist denn nun das Problem?

zeige mal die onClick

Wird den auch der Text von den Button in der onClick geändert?

Wie soll das überhaupt weiter gehen? Zb. Was soll passieren wenn du in der Main ein anderes Datum klickst. Soll da auch die gleiche alte Tabelle geladen werden?

Wass soll passieren wenn du aus der zweiten Activity zurück zu Main gehst?

— geändert am 23.04.2019, 14:56:51

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11

23.04.2019, 15:42:21 via Website

Also es ist sozusagen ein Terminkalender und ich will für jeden Tag was anderes speichern können. Ich klicke auf einen Tag (day), dann öffnet sich das TabellenFenster. Dort setzte ich meine Kreuze und speicher diese auf diesen Tag. Dann gehe ich auf einen anderen Tag im Kalender. Dort setz ich wieder Kreuze und diese werden wieder auf den Tag gespeichert usw. Im Moment habe ich es so, dass die gleiche Tabelle auf alle Tage gespeichert wird.

on Click:

@Override
public void onClick(View v) {

        switch (v.getId()) {
        case R.id.field_2_1:
            f21.setText(xo);
            handleInput( 2, 1, f21);
            break;
        case R.id.field_3_1:
            f31.setText(xo);
            handleInput( 3,1, f31);
            break;
        case R.id.field_4_1:
            f41.setText(xo);
            handleInput( 4,  1, f41);
            break;
        case R.id.field_2_2:
            f22.setText(xo);
            handleInput( 2,  2, f22);
            break;
        case R.id.field_3_8:
            f38.setText(xo);
            handleInput( 3, 8, f38);
            break;
        case R.id.field_3_7:
            f37.setText(xo);
            handleInput( 3,7, f37);
            break;
        case R.id.field_2_3:
            f23.setText(xo);
            handleInput(2, 3, f23);
            break;
        case R.id.field_3_6:
            f36.setText(xo);
            handleInput(3,  6, f36);
            break;
        case R.id.field_4_8:
            f48.setText(xo);
            handleInput( 4,  8, f48);
            break;
        case R.id.field_2_4:
            f24.setText(xo);
            handleInput( 2,  4, f24);
            break;
        case R.id.field_4_6:
            f46.setText(xo);
            handleInput( 4,  6, f46);
            break;
        case R.id.field_2_5:
            f25.setText(xo);
            handleInput( 2,  5, f25);
            break;
        case R.id.field_3_5:
            f35.setText(xo);
            handleInput( 3,  5, f35);
            break;
        case R.id.field_2_6:
            f26.setText(xo);
            handleInput( 2,  6, f26);
            break;
        case R.id.field_2_7:
            f27.setText(xo);
            handleInput( 2,  7, f27);
            break;
        case R.id.field_2_8:
            f28.setText(xo);
            handleInput( 2,  8, f28);
            break;
        case R.id.field_2_9:
            f29.setText(xo);
            handleInput( 2,  9,f29);
            break;
        case R.id.field_2_10:
            f210.setText(xo);
            handleInput( 2,  10, f210);
            break;
        case R.id.field_2_11:
            f211.setText(xo);
            handleInput( 2,  11, f211);
            break;
    }

}

private void handleInput (int x, int y, Button b){
    if (MainActivityStorage[x - 1][y - 1] == 0) {
        b.setText("X");
        MainActivityStorage[x - 1][y - 1] = 1;

    } else{
        b.setText("");
        MainActivityStorage[x - 1][y - 1] = 0;
    }

}
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

23.04.2019, 16:28:42 via Website

Hallo

Dort setzte ich meine Kreuze und speicher diese auf diesen Tag.

Eine Frage dazu Wo speicherst du deine Kreuze denn? Und zwar für jeden Tag einzeln?
Du hast 19 Pref KeyWorte in denen du in der in der zweiten Activity deine kreuzte für einen Tag speicherst.
So wie dein Code ist kannst du nur einen tag speicher und zar immer den lesten bearbeitgeten.
Eine Db oder änliches gibt es die dier nicht

Im Moment habe ich es so, dass die gleiche Tabelle auf alle Tage gespeichert wird.

Du hast ja auch nur eine Tabelle als Pref Datei. Du müsstest schon jeden Tag einzeln speichen.
Du speicherst ja jeden neuen Tag in den gleichen Datensatz also auf den gleichen Speicher.

Was machst du wenn du zur Main zurück gehst speiserst du die Tabelle „Pref key“ irgendwie in dem Kalender?

Wenn du jedenTag Speichen willst müsstest du für jeden Tag eine andere Pref Datei anlegen.

SharedPreferences sharedPreferences = getSharedPreferences("MyKey", 0);

SharedPreferences sharedPreferences = getSharedPreferences(date, 0);
Somit würde für jeden Tag eine neue Pref Datei angelegt.

Das ist natürlich nicht sehr schön und spätestens wenn du auch eine suche oder andere Dinge haben willst ist damit vorbei.
Deshalb der Tipp mit der Datenbank.

Auch verstehe ich nicht was das mit Array MainActivityStorage soll?

— geändert am 23.04.2019, 16:56:47

Hilfreich?
Amo
Diskutiere mit!
  • Forum-Beiträge: 11

23.04.2019, 16:55:36 via Website

Okay schade, dachte komme um die Db herum... trotzdem vielen Dank für deine Geduld und Hilfe.
Array MainActivityStorage ist dafür da, dass ich kreuze in meine Button setzen kann und auch wieder entfernen per Klick;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

23.04.2019, 16:58:46 via Website

das kannst du auch gleich mit den strings machen.
Für den anfang solte das mit den einzelnen Pref datein gehen so hast du es dir bestimmt auch gedacht.
Ändere einfach mal die zwei zeilen und du wirst es sehen.

dann wird immer eine neue Pref Datei mit dem Namen des übergebenen Datums erstellt , da das ein String ist solte das gehen. die Pref Datei heist dann eben wie das Datum.

— geändert am 23.04.2019, 17:06:25

Hilfreich?
Amo
Diskutiere mit!
  • Forum-Beiträge: 11

23.04.2019, 17:09:41 via Website

ja aber wenn Db besser ist, mache ich doch lieber das.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.236

23.04.2019, 17:09:42 via Website

@Amo

Unter Android kennt man eigentlich keine statischen Arrays und Parameter - diese können jederzeit vom Betriebssystem getötet werden . (GC / LifeCycle)
Wie von Geisterhand läuft dann deine App nicht mehr.

Tipp : Verabschiede dich ein wenig mehr von statischen , mehrdimensionalen Arrays .
Du solltest unter Java mehr mit dynamischen Array(Listen) arbeiten und Klassen als Objekte nehmen.
Und ich vermute , dass du ggf diese Arrays später klassenübergreifend verwenden magst ...

Das ist so unter Java nicht Möglich - da musst du andere Klassen Typen als Vererbung einsetzen - z.b. Single Ton

HINWEIS an die anderen Jungs :
https://www.android-hilfe.de/forum/android-app-entwicklung.9/speichern-auf-einen-tag-day-im-kalender-calendarview.910452.html#post-11537187

— geändert am 23.04.2019, 17:23:18

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

23.04.2019, 17:39:38 via Website

ja aber wenn Db besser ist, mache ich doch lieber das.

OK

aber beachte auch die Hinweise von saw00.

Hilfreich?
Amo
Diskutiere mit!
  • Forum-Beiträge: 11

01.05.2019, 13:31:21 via Website

Hey, habe jetzt ein anderes Problem und zwar möchte ich die Hintergrundfarbe der Buttons ändern, aber nur wenn ich zB dreimal in der Woche ein X in einem Button am Tag gesetzt habe. Hast du ein Vorschlag wie ich das umsetzen kann? image

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

01.05.2019, 13:47:49 via Website

imHallo erstmal eine Frage wie machst du denn nun deine Verwaltung der Stunden? Immer noch mit den pref oder über eine DB. Eine db finde ich auf jeden Fall sinnvoller.

In einer db kannst du ja eine abfragen machen. zb nach der Anzahl der Einträge in einem Zeitraum und einem Fach. Und das Ergebnis auch anzeigen.

Kommt natürlich auch darauf an wie deine Tabelle oder Tabellen in der db aussiehst.
Am Anfang ist es immer sinnvoll sich gegangen zu machen was in der db gespeichert werden soll und wie die Tabellen aus sehen sollen.

Wie sieht den deine Tabelle aus?

Solltest noch mit den prefs arbeiten ist das schwer da du das alles selber verwalten müsstest also keine abfragen dieser Art machen kanns.

— geändert am 01.05.2019, 13:54:12

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11

01.05.2019, 14:04:23 via Website

Hey, habs mit Datenbank probiert, aber irgendwie ging es nicht so wie ich es wollte, bzw. habe das nicht so hinbekommen. Habe es jetzt mit SharedPreferences gemacht.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

01.05.2019, 14:30:24 via Website

Hallo wie ist das kennst du dich zu mindestens etwas mit DB aus.
Ein paar Grundkenntnisse in SQL sind da schon vom vorteil.

Überlebe dir eine sinnvolle Struktur also Welche Tabellen brauche ich wass soll in ihnen gespeichert werden wie sollen die Tabellen in Beziehung stehen .....? Das hat wenig mit android zu tun sondern ist Datenbank Grundwissen.

— geändert am 01.05.2019, 14:31:24

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

01.05.2019, 15:02:19 via Website

Solltest du an deinen pref Dateien festhalten wollen.
müsstest du die pref Dateien in dem Zeitraum denn du abfragen willst selber ein lesen und nach den gesuchten Daten durchsuchen und zählen.
Bei einer Woche wären das 7 Tage, 7 Dateien die du zb. in einer schleife einlesen müsstest, um immer in dem gesuchten Fach zu prüfen ob es gesetzt ist oder nicht. Wenn du immer bei einem kreuz eine variable hoch zählst hättest du am ende der schleife das Ergebnis.

Ob das Sinn macht musst du entscheiden.

— geändert am 01.05.2019, 15:04:56

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11

01.05.2019, 15:11:05 via Website

Ne gar nicht. Ich habe erst vor zwei-einhalb Wochen mit Android Studio angefangen. Deswegen war ich ja froh, dass es mit Shared Preferences funktioniert hatte. Hab mir das ja alles von Youtube Videos abgeleitet. Leider gibt es für das was ich brauche keine Videos oder Webeinträge. Wenn ich da eine ähnliche Anleitung gefunden hätte, hätte ich das ja für meine App zugeschnitten. Vom Kopf her weiß ich wie ich das machen müsste, nur fehlt mir die Kenntnis von der Sprache im Detail.

Hilfreich?
Diskutiere mit!