txt Datei nach Datum auswählen und anzeigen und Liste aller txt

  • Antworten:107
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 52

19.02.2014, 15:50:00 via Website

Hallo zusammen,

ich habe zwei Fragen und hoffe, dass Ihr mir helfen könnt / möchtet.

1.) Wenn ich im raw Ordner 366 Dateien habe (abc.txt, def.txt, ghi.txt,...), kann ich diese per Button je nach aktuellem Datum anzeigen lassen?
Beispiel: Heute 19.02.2014 = abc.txt, Morgen 20.02.2014 = def.txt, ...

2.) Kann ich alle txt-Dateien aus dem raw Ordner per ListView anzeigen lassen und per Klick öffnen?

Ich habe dazu leider nichts (für mich) verständliches gefunden. Zwar habe ich bei Google schon längere Zeit gesucht, aber leider war nichts dabei, was funktioniert hat. Ich freue mich über jeden Tip.

Liebe Grüße,
Anna

Antworten
  • Forum-Beiträge: 52

19.02.2014, 16:38:25 via Website

Hallo impjor,

danke für deine schnelle Antwort.

In SQL oder SQLlite habe ich leider gar keine Erfahrung, daher wollte ich es so ausprobieren. Die Dateien beinhalten lediglich Texte und sind nicht sehr groß (ca. 3 - 10 KB p. Datei ~ 3,6 MB gesamt).
Meinst Du, dass hier aus Performance Gründen zwingend eine DB notwendig ist?

Liebe Grüße,
Anna

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

19.02.2014, 17:36:09 via Website

Zwingend notwendig ist eine Datenbank nicht aber wesentlich einfacher zu managen wenn zb. Files dazu kommen, oder du sie anders sortieren willst.
In einer DB geht das umsortieren wesentlich schneller als im Dateisystem.

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

Antworten
  • Forum-Beiträge: 52

19.02.2014, 18:27:33 via Website

Hallo Pascal,

es wird keine Datei hinzukommen.

Es soll so etwas wie ein Adventskalender für das ganze Jahr werden, bzw. wie diese Sprüche Kalender zum abreißen. Jeden Tag ein anderer Spruch.

Kann ich das nicht mit einer if else abfrage machen?

Liebe Grüße,
Anna

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

19.02.2014, 18:49:47 via Website

Na ja als erstes musst du die Dateien einlesen, dann schauen zu welchem Datum sie gehören.
Da das Änderungsdatum nicht über das Jahr verteilt ist, musst du jeder Datei einen Datums Namen geben und diesen dann in Anroid in ein Datum einlesen. In einer For Schleife für jede Datei kannst du dann Prüfen, welcher Tag heute ist, und welchen Spruch du somit anzeigen musst.

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

Antworten
  • Forum-Beiträge: 52

19.02.2014, 19:01:19 via Website

Danke für deine Antwort, leider verstehe ich sie nicht ganz :*)

Da das Änderungsdatum nicht über das Jahr verteilt ist, musst du jeder Datei einen Datums Namen geben und diesen dann in Anroid in ein Datum einlesen.
Was meinst du damit?

Gibt es evtl. ein Beispiel an dem ich mich orientieren kann?

LG Anna

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

19.02.2014, 19:09:46 via Website

Also du hast Dateien, die immer wie das jeweilige Datum heißen, an dem sie erscheinen sollen. zb. 19.02.2014.txt
Du liest also die Dateinamen aller Dateien in ein Array und gehst dieses dann per schleife durch.
Somit kannst du das Dateinamedatum aus dem Dateinamen lesen und vergleichen, ob das Datum der Datei mit dem Aktuellen Datum überein stimmt.
Wenn ja dann kannst du die entsprechende Datei einlesen und den Text anzeigen lassen.

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

BoRo

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

19.02.2014, 20:19:12 via App

Auf die Idee bin ich garnicht gekommen geht natürlich viel infacher als alles in einer Schleife durchzugehen.

— geändert am 19.02.2014, 20:19:48

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

Antworten
  • Forum-Beiträge: 52

20.02.2014, 08:47:53 via Website

Hallo zusammen,

vielen Dank für die Tipps :) !

Ich werde mich gleich dran machen. Melde mich dann (hoffentlich) mit der Lösung zurück.

LG Anna

Antworten
  • Forum-Beiträge: 272

20.02.2014, 10:32:26 via Website

Warum legst du alle Sprüche nicht in der string.xml an? Wenn schon keine Datenbank. Die Datei wird zwar etwas groß, aber da musst du dann auch keine Dateien mehr lesen, sondern einfach nur den passenden String zum Tag anzeigen.

— geändert am 20.02.2014, 10:32:40

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

20.02.2014, 11:23:24 via Website

Dateien verwalten ist aber einfacher als sie strings verwalten allein von editor etc.
Wenn man halt einzelne Dateien hst kann man sie durch kopieren gegeneinander austauschen in den strings xml geht das nicht

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

Antworten
  • Forum-Beiträge: 272

20.02.2014, 11:33:06 via Website

Klar, in der string.xml geht es noch viel einfacher. Da müssen die einzelnen Dateien nicht mal erstellt werden und soweit ich es verstanden habe, soll es ja nur jeden Tag einen Spruch geben. Da muss man also nicht großartig was ändern, und wenn, dann fasst man nur die string.xml an und kann ein Update nachschieben, ohne dass man dabei den Quellcode ändern muss, nur weil da eine neue Datei hinzugekommen ist.

— geändert am 20.02.2014, 11:33:39

Antworten
  • Forum-Beiträge: 52

20.02.2014, 14:24:17 via Website

Hallo zusammen,

die .txt Dateien als Datum zu benennen gestaltet sich (nach meinem Wissensstand) schwierig. Als "20.02.2014 .txt" und als "20022014 .txt" werden die Dateien nicht erkannt. Zum Test habe ich nun eine txt als "babajaga .txt" benannt.

MainActivity:
1package com.geschichten.app;
2import java.io.ByteArrayOutputStream;
3import java.io.IOException;
4import java.io.InputStream;
5import java.util.Calendar;
6import android.app.Activity;
7import android.app.DatePickerDialog;
8import android.app.Dialog;
9import android.os.Bundle;
10import android.view.View;
11import android.widget.Button;
12import android.widget.DatePicker;
13import android.widget.TextView;
14import android.widget.Toast;
15
16public class MainActivity extends Activity {
17
18 /** Private members of the class */
19 private TextView pDisplayDate;
20 private Button pPickDate;
21 private int pYear;
22 private int pMonth;
23 private int pDay;
24 /** This integer will uniquely define the dialog to be used for displaying date picker.*/
25 static final int DATE_DIALOG_ID = 0;
26
27 /** Callback received when the user "picks" a date in the dialog */
28 private DatePickerDialog.OnDateSetListener pDateSetListener =
29 new DatePickerDialog.OnDateSetListener() {
30
31 public void onDateSet(DatePicker view, int year,
32 int monthOfYear, int dayOfMonth) {
33 pYear = year;
34 pMonth = monthOfYear;
35 pDay = dayOfMonth;
36 updateDisplay();
37 displayToast();
38 }
39 };
40
41 /** Updates Datum im TextView */
42 private void updateDisplay() {
43 pDisplayDate.setText(
44 new StringBuilder()
45 // Month is 0 based so add 1
46 .append(pDay + 1).append(".")
47 .append(pMonth).append(".")
48 .append(pYear).append(" "));
49 }
50
51 /** Anzeige, dass Datum geändert ist */
52 private void displayToast() {
53 Toast.makeText(this, new StringBuilder().append("Date choosen is ").append(pDisplayDate.getText()), Toast.LENGTH_SHORT).show();
54
55 }
56
57 /** Called when the activity is first created. */
58 @Override
59 public void onCreate(Bundle savedInstanceState) {
60 super.onCreate(savedInstanceState);
61 setContentView(R.layout.fragment_main);
62
63
64 /** Geschichtenelement anzeigen */
65 TextView babajaga = (TextView) findViewById(R.id.displayText);
66 babajaga.setText(readText());
67 /** Datumselement anzeigen */
68 pDisplayDate = (TextView) findViewById(R.id.displayDate);
69 pPickDate = (Button) findViewById(R.id.pickDate);
70
71 /** Listener for click event of the button */
72 pPickDate.setOnClickListener(new View.OnClickListener() {
73 public void onClick(View v) {
74 showDialog(DATE_DIALOG_ID);
75 }
76 });
77
78 /** Get the current date */
79 final Calendar cal = Calendar.getInstance();
80 pYear = cal.get(Calendar.YEAR);
81 pMonth = cal.get(Calendar.MONTH);
82 pDay = cal.get(Calendar.DAY_OF_MONTH);
83
84 /** Display the current date in the TextView */
85 updateDisplay();
86 }
87
88 /** Create a new dialog for date picker */
89 @Override
90 protected Dialog onCreateDialog(int id) {
91 switch (id) {
92 case DATE_DIALOG_ID:
93 return new DatePickerDialog(this,
94 pDateSetListener,
95 pYear, pMonth, pDay);
96 }
97 return null;
98 }
99
100 private String readText() {
101
102 InputStream inputStream = getResources().openRawResource(
103 R.raw.babajaga);
104
105 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
106
107 int i;
108 try {
109 i = inputStream.read();
110 while (i != -1) {
111 byteArrayOutputStream.write(i);
112 i = inputStream.read();
113 }
114 inputStream.close();
115 } catch (IOException e) {
116 e.printStackTrace();
117 }
118
119 return byteArrayOutputStream.toString();
120 }
121
122}

Könnt ihr mir sagen, wie ich die Verbindung zwischen Datumsstring und Textdatei bekomme, wenn ich die Dateien nicht nach entsprechendem Datum benennen kann?

LG Anna

p.s.: Ich wollte meinen fragment_main.xml Code zur Ansicht einfügen, aber es kam nur die Meldung, dass neue Mitglieder keinen Link zu externen Webseiten einfügen dürfen.

Edit:
Fehler bei "20.02.2014.txt":
1Meldung:
2error: <identifier> expected
3error: illegal start of type
4
5Anzeige (R.java):
6public static final class raw {
7 public static final int 20=0x7f050000;
8 public static final int babajaga=0x7f050001;
9 }

— geändert am 20.02.2014, 15:44:58

Antworten
  • Forum-Beiträge: 272

21.02.2014, 07:51:48 via Website

Sicher dass du die richtigen Dateinamen verwendest? Weil ich mal mit " " im Dateinamen sehe und mal ohne " ".

Antworten
  • Forum-Beiträge: 52

21.02.2014, 08:53:57 via Website

Die " " habe ich nur in der Beschreibung für die Dateinamen (außerhalb des Codes). In meinem Code ist der Dateiname immer babajaga:

65 TextView babajaga = (TextView) findViewById(R.id.displayText);
66 babajaga.setText(readText());    

102 InputStream inputStream = getResources().openRawResource(
103 R.raw.babajaga);

EDIT: Dateien im asset Ordner können Zahlen im Namen haben, hier wird mir kein Fehler ausgegeben.

EDIT2:

Ich bekomme, wenn ich versuche die Datei über den AssetManager aufzurufen, die Fehlermeldung "java.io.FileNotFoundException:0.txt" angezeigt und finde leider den Fehler nicht.

TextView myText = (TextView)findViewById(R.id.displayText);

AssetManager assetManager = getAssets();
InputStream inputStream = null;

String MyStream;
try {
    //assets/MyAssets.txt
    inputStream = assetManager.open(pDay + pMonth + pYear + ".txt");

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byte[] bytes = new byte[4096];

    int len;
    while ((len = inputStream.read(bytes)) > 0){
        byteArrayOutputStream.write(bytes, 0, len);
    }

    MyStream = new String(byteArrayOutputStream.toByteArray(), "UTF8");

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    MyStream = e.toString();
}

myText.setText(MyStream);

— geändert am 21.02.2014, 15:51:34

Antworten

Empfohlene Artikel