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

  • Antworten:107
  • Bentwortet
BoRo
  • 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
impjor
  • Forum-Beiträge: 1.793

19.02.2014, 16:26:30 via App

Bei 366 Dateien die gelistet / sortiert werden müssen, würde ich über eine Datenbank nachdenken, die das sicher performanter lösen kann.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
BoRo
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
BoRo
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
impjor
  • Forum-Beiträge: 1.793

19.02.2014, 20:12:32 via App

Wenn du die Dateien nach dem Datum bennen kannst, kannst du einfach mit SimpleDateFormat das aktuelle Datum in einen String umwandeln und dann DatumsString + ".txt" einlesen.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

BoRo

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

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
BoRo
  • 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
SvenDD
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
SvenDD
  • 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
BoRo
  • 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
SvenDD
  • 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
BoRo
  • 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
impjor
  • Forum-Beiträge: 1.793

21.02.2014, 16:34:18 via App

Warum versuchst du denn 0.txt zu öffnen ;) Ne, mal im Ernst: Scheinbar sind pDay und pMonth und pYear keine gültigen Strings.

Und benutze doch einen BufferedReader anstatt dieser byte-Geschichte.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • Forum-Beiträge: 52

21.02.2014, 16:42:42 via Website

:P

pDay pMonth und pYear funktionieren. Ich habe zum Testen ein TextView in dem ich das ausgewählte Datum anzeigen lasse. Das wird alles richtig angezeigt (siehe oben MainActivity Code).

Ich habe auch versucht

 inputStream = assetManager.open("test.txt");

aufzurufen. Da bekomme ich den gleichen Fehler :(

Zum Testen habe ich eine Textdatei in 0.txt umbenannt. Ich bekomme trotzdem den gleichen Fehler. Kann es sein, dass er den assets Ordner gar nicht findet?

Mir ist aber nicht aufgefallen, dass in InputStream inputStream = null; nichts übergeben wird, weil null nicht initialisiert ist. Ich finde den Fehler in meinem Code aber nicht.

Liebe Grüße.

— geändert am 21.02.2014, 16:46:08

Antworten
impjor
  • Forum-Beiträge: 1.793

21.02.2014, 16:52:14 via App

Du hast die Dateien auch in den Ordner /assets/ gespeichert, nicht unter res/assets oder res/raw/assets oder so was?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • Forum-Beiträge: 52

21.02.2014, 17:31:07 via Website

Ich gehe mal davon aus, dass der Ordnerpfad richtig ist :O

Screenshot: www.young-fresh.de/assets.PNG (Leider kann ich hier irgendwie kein Bild einfügen, daher so)

Antworten
BoRo
  • Forum-Beiträge: 52

24.02.2014, 10:46:08 via Website

Hallo zusammen,

ich wünsche allen einen guten Start in die Woche :)

Nach einiger Tüftelei habe ich raus gefunden, dass mir zwar das heutige Datum als String in meinem Test Textfeld angezeigt wird, aber im Hintergrund ein falsches genutzt wird.

Das Textfeld wird generiert aus:

private void updateDisplay() {
        pDisplayDate.setText(
                new StringBuilder()
                        // Month is 0 based so add 1
                        .append(pDay).append(".")
                        .append(pMonth + 1).append(".")
                        .append(pYear).append(" "));

Mit

inputStream = assetManager.open(Calendar.DAY_OF_MONTH + "." + Calendar.MONTH + ".txt");

sehe ich nun, dass 5.2.txt aufgerufen wird. Wenn ich meine Datei dementsprechend umbenenne wird mir auch der Inhalt wieder angezeigt.

Die Variablen pDay, pMonth, pYear (geben 0 zurück) und pDisplayDate (gibt null zurück) funktionieren im assetManager aber weiterhin nicht.

Wie bekomme ich nun das heutige Datum heraus?

Liebe Grüße, Anna

Antworten
impjor
  • Forum-Beiträge: 1.793

24.02.2014, 13:57:55 via App

Entferne einfach mal die Variabeln pDay, pMonth, pYear und die Funktion updateDisplay().

Dann erstellst du eine Funktion, die das Datum als String zurückliefert.
In der onCreate kannst du dann testen, ob das Datum richtig ist textView#setText(tolleFunktionDieDasDatumZurückGibt()); deine Datei-Öffnen-Funktion greift dann auch auf diese Funktion zurück.

So siehst du genau, welche Datei geöffnet wird.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • Forum-Beiträge: 52

24.02.2014, 14:00:46 via Website

Ich habe es geschafft :D

Mein Code musste nur etwas weiter nach unten und die Wandlung von pDisplayDate in einen String hat gefehlt:

String str = pDisplayDate.getText().toString();

Jetzt kann ich str verwenden um das ausgewählte Datum aufzurufen.

Ich danke euch für eure Hilfe!!!

Liebe Grüße Anna

Antworten
BoRo
  • Forum-Beiträge: 52

26.02.2014, 11:47:59 via Website

Hello again,

ich habe diesen Beitrag voreilig auf "Beantwortet" gesetzt :*)

Ich schaffe es einfach nicht, meine txt Dateien aus dem Assets Ordner in einer ListView anzeigen zu lassen. Gibt es hierzu ein verständliches Beispiel? Ich habe schon einiges gefunden zum Dateien auslesen, aber nicht, wie man die ausgelesenen Dateien in eine Liste bekommt.

Liebe Grüße,
Anna

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

26.02.2014, 13:25:03 via App

Was willst du in eine Liste bekommen?
Die Dateinamen oder die Dateiinhalte?

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

Antworten
BoRo
  • Forum-Beiträge: 52

26.02.2014, 14:35:39 via Website

Hallo Pascal,

ich möchte die erste Zeile aus jeder .txt Datei in der Liste anzeigen lassen.

LG
Anna

Antworten
BoRo
  • Forum-Beiträge: 52

26.02.2014, 17:16:14 via Website

Genau das war auch mein Beispiel, aber ich habe bei

[code]for(int i=0; i<files.length; i++)="" {="" txtfilename.append("\n="" file="" :"+i+"="" name=""> "+files[i]);[/code]

einen Fehler erhalten, den ich nicht weg bekommen habe.

Wenn ich mit einem Array Adapter arbeite, kann ich da vielleicht einen Link einsetzen um die Datei aufzurufen?
Evtl. so ähnlich:
1<string-array name="test">
2<item>
3<name>value 1</name>
4<link>/assets/value1.txt</link>
5</item>
6<item>
7<name>value 2</name>
8<link>/assets/value2.txt</link>
9</item>
10<item>
11<name>value 3</name>
12<link>/assets/value3.txt</link>
13</item>
14</string-array>

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

26.02.2014, 17:19:20 via Website

poste bitte mal den Feler mit LogCat.
Dann brauchst du es nicht so umständlich machen.
Und bitte noch die komplette for schleife.

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

Antworten
impjor
  • Forum-Beiträge: 1.793

26.02.2014, 17:21:18 via App

[quote=BoRo][code]for(int i=0; i<files.length; i++)="" {="" txtfilename.append("\n="" file="" :"+i+"="" name=""> "+files[i]);[/code]
[/quote]
Was genau machen diese ganzen ="" da?? Das sieht sehr kryptisch aus...

Zum string-array: Ja das würde funktionieren.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • Forum-Beiträge: 52

26.02.2014, 18:14:36 via Website

Pascal P.
poste bitte mal den Feler mit LogCat.
Dann brauchst du es nicht so umständlich machen.
Und bitte noch die komplette for schleife.

Ich kann dir leider nicht sagen, was in der LogCat steht, weil da nichts drin ist. Ich habe sie vorhin geleert, da ich noch etwas anderes integrieren wollte (um den Überblick zu behalten) und nun steht immer noch nichts drin.

TextView txtFileName = (TextView) findViewById(R.id.txtFileName);

Die Schleife sieht so aus, wie in dem Beispiel (zum Downloaden). Aber es passiert eben nichts, die App geht beim aufrufen aus.
[code]
AssetManager assetManager = getAssets();

// To get names of all files inside the "Files" folder
try {
String[] files = assetManager.list("Files");

for(int i=0; i<files.length; i++)
{
txtFileName.append("\n File :"+i+" Name => "+files[i]);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
[/code]

impjor
Was genau machen diese ganzen ="" da?? Das sieht sehr kryptisch aus...

Das ist aus dem Beispiel kopiert.

impjor
Zum string-array: Ja das würde funktionieren.

Benutzt man dann auch <link></link>? Wie kann ich dem ArrayAdapter mitteilen, dass er den Link aufmachen soll?

Liebe Grüße,
Anna

Antworten
impjor
  • Forum-Beiträge: 1.793

26.02.2014, 18:31:28 via Website

Du musst doch erstmal von jeder Datei die erste Zeile lesen, oder? Dein Code muss irgendwie so aussehen:

1List<String> items = new ArrayList<String>();
2
3for (int i = 0; i < anzahlDateien; i++) {
4String ersteZeile = leseErsteZeileVonDatei(i);
5items.add(ersteZeile);
6}
7
8ArrayAdapter<String> itemsAdapter =
9 new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
10
11ListView#setAdapter(itemsAdapter);

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • Forum-Beiträge: 52

27.02.2014, 13:52:56 via Website

Ich habe das noch nicht verstanden :(

"anzahlDateien" muss ich mit der Tatsächlichen Anzahl der Dateien Überscheiben? (Wenn ja, wären das in meinem Fall 366)
Eine Zeile lese ich mit readLine aus, oder? Da muss aber noch was fehlen, da mir der Fehler "Create Methode readLine(int)" angezeigt wird. Aber was muss ich dann in diese Methode reinschreiben?

1public class ListeAnzeigen extends ListActivity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6
7 setContentView(R.layout.activity_liste);
8
9 List<String> items = new ArrayList<String>();
10
11 for (int i = 0; i < 366; i++) {
12 String ersteZeile = readLine(i);
13 items.add(ersteZeile);
14 }
15
16 ArrayAdapter<String> itemsAdapter =
17 new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
18
19 setListAdapter(itemsAdapter);
20 }
21
22 private String readLine(int i) {
23 // TODO Auto-generated method stub
24 return null;
25 }
26
27}

Und woher weiß Android, dass nur der Ordner assets durchsucht werden soll?

Sorry, dass ich (für euch wahrscheinlich) so blöde Fragen stelle, aber ich würde es auch gern verstehen.

LG Anna

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

27.02.2014, 13:56:29 via Website

Wie hier ( http://www.javacodegeeks.com/2012/02/android-read-file-from-assets.html )
beschrieben kannst du Dateien lesen. Du musst halt aus int i die Richtige Datei ermitteln.
Am besten anhand eines Textarrays.

— geändert am 27.02.2014, 13:56:37

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

Antworten
impjor
  • Forum-Beiträge: 1.793

27.02.2014, 14:11:07 via Website

BoRo

"anzahlDateien" muss ich mit der Tatsächlichen Anzahl der Dateien Überscheiben? (Wenn ja, wären das in meinem Fall 366)
Ja, genau.


Eine Zeile lese ich mit readLine aus, oder? Da muss aber noch was fehlen, da mir der Fehler "Create Methode readLine(int)" angezeigt wird. Aber was muss ich dann in diese Methode reinschreiben?
Diese Methode musst du natürlich selber programmieren, dass sie eben anhand von i die Datei findet, sie öffnet, ließt und die erste Zeile zurückliefert.


Und woher weiß Android, dass nur der Ordner assets durchsucht werden soll?
Gar nicht. Du musst ja die oben genannte Methode programmieren.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • Forum-Beiträge: 52

05.03.2014, 11:55:33 via Website

Hallo,

Leider komme ich hier immer noch nicht weiter. :*)

Gruß Anna

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

05.03.2014, 12:00:19 via App

Bei was hängst du denn?

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

Antworten
BoRo
  • Forum-Beiträge: 52

05.03.2014, 15:28:25 via Website

Immer noch bei der Methode zum auslesen und zurückgeben der ersten Zeile.

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

05.03.2014, 15:33:47 via Website

Warum ist das so schwiereig?
Wie sieht denn dein jetziger Code aus

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

Antworten
BoRo
  • Forum-Beiträge: 52

05.03.2014, 15:45:00 via Website

Ich weiß nicht, warum das für mich so schwierig ist. Wenn ich etwas verstanden habe, funktioniert es auch. In diesem Fall verstehe ich das aber nicht. :(

Der aktuelle code sieht so aus:

1@Override
2 protected void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4
5 setContentView(R.layout.activity_liste);
6
7 List<String> items = new ArrayList<String>();
8
9 for (int i = 0; i < 366; i++) {
10 String ersteZeile = readFileFromAssets(i);
11 items.add(ersteZeile);
12 }
13
14 ArrayAdapter<String> itemsAdapter =
15 new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
16
17 setListAdapter(itemsAdapter);
18
19 }
20
21 private String readFileFromAssets(String filename)
22 {
23 StringBuilder sb = new StringBuilder();
24 try
25 {
26 BufferedReader reader = new BufferedReader(new InputStreamReader(getAssets().open(filename), "UTF-8"));
27
28 // do reading, usually loop until end of file reading
29 String mLine = reader.readLine();
30 while(mLine != null)
31 {
32 // process line
33 sb.append(mLine);
34 mLine = reader.readLine();
35 }
36
37 reader.close();
38 } catch(IOException e)
39 {
40 // log the exception
41 e.printStackTrace();
42 }
43
44 return sb.toString();
45 }

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

05.03.2014, 16:01:11 via Website

Das kann doch schon nicht Funktionieren.
1String ersteZeile = readFileFromAssets(i); //Hier übergibst du ein integer aber in der Funktion brauchst du einen String den Filename.
Deswegen brauchst du irgendwas, was dir int in string umwandelt
Da würde sowas Passen:



[code]

String[] Array = {"01.01.txt","02.01.txt","03.01.txt","04.01.txt",...};
//Dann
readFileFromAssets(Array[i]); //Das i-te Element des Arrays


[/code]

Und dann beim ReadFile:

1StringBuilder buf=new StringBuilder();
2 InputStream file=getAssets().open(filename);
3 BufferedReader in=
4 new BufferedReader(new InputStreamReader(file));
5 String str;
6
7 while ((str=in.readLine()) != null) {
8 buf.append(str);
9 }
10
11return str;
12
13 in.close();

— geändert am 05.03.2014, 16:01:35

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

Antworten
impjor
  • Forum-Beiträge: 1.793

05.03.2014, 16:47:27 via App

Bevor du anfängst ein Array mit 365 Elementen für die Tage zu machen sieh dir mal die Klasse GregorianCalendar an. Damit dürfte die Umwandlung x. Tag im Jahr <-> xx.xx.xxxx funktionieren.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
BoRo
  • Forum-Beiträge: 52

06.03.2014, 08:59:45 via Website

Was ich hier jetzt noch nicht verstehe:

- Bei [b]readFileFromAssets(Array[i]);[/b] erhalte ich einen Fehler. Ich soll für [i] eine locale Variable, einen Parameter oder eine Konstante erstellen. Da dass alles Integer Werte sind, verstehe ich den Zusammenhang nicht, da ich ja einen String brauche.

- In der ArrayList wird readFileFromAssets(i); immer noch ein Fehler angezeigt. Hier wird bemängelt, dass entweder readFileFromAssets(String filename) in einen Integer verwandelt oder der Integer in for (int i = 0; i < 366; i++) { in einen String umgewandelt werden soll.

- In der Methode readFileFromAssets bekomme ich einen Fehler für in.close(); ohne Hinweis. zur Behebung.

LG

— geändert am 06.03.2014, 08:59:55

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

06.03.2014, 10:12:08 via Website

1.Du darfst das array ("Array[i]") nicht Großschreiben, da es sonst nicht deine ArrayVariable ist sondern di Klasse Array, die du hier benutzt.
2. ist klar, dass da immernoch ein Fehler angezeigt wird, da das mit dem array ja noch nicht stimmt.
PS: die Stingübergabe ist volkommen richtig;
3. Bei in.close ist der Fehler, der unreachable Code, da das Close nach dem return; kommt und dann kann es nie ausgeführt werden ( Mein Fehler im oberen Code :) )

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

Antworten
BoRo
  • Forum-Beiträge: 52

06.03.2014, 10:34:43 via Website

Danke für die Antwort, schon mal was gelernt :)

Wenn ich
[code] String[] array = {"1.1.txt","2.1.txt","3.1.txt","4.1.txt","5.1.txt"};
//Dann
readFileFromAssets(array[i]); //Das i-te Element des Arrays[/code]
schreibe, habe ich immer noch den gleichen Fehler.

Wenn ich
[code] String[] Array = {"1.1.txt","2.1.txt","3.1.txt","4.1.txt","5.1.txt"};
//Dann
readFileFromAssets(array[i]); //Das i-te Element des Arrays[/code]
schreibe, wird array[i] nicht als Variable erkannt.

Antworten
SvenDD
  • Forum-Beiträge: 272

06.03.2014, 10:38:58 via Website

Weil Groß- und Kleinschreibung eine Rolle spielen.

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

06.03.2014, 10:42:17 via Website

Muss jetzt funktionieren, mach nochmal nen BuildAll, macnchmal wird nicht erkann, dass die Fehler weg sind.
Wenn dann immernoch Fehler da sind, bitte Fehlerbeschreibung posten

— geändert am 06.03.2014, 10:42:33

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

Antworten