Programmabsturz bei methoden aufruf

  • Antworten:28
Jan S
  • Forum-Beiträge: 18

07.10.2015, 13:09:54 via Website

Hallo Leute,

ich bin ganz neu hier und bräuchte direkt mal eure Hilfe.Es ist ganz simpel aber ich hab seit Jahren nichts mehr programmiert und mir fällt der richtige Weg grade nicht ein.

Ich möchte eine kleine App schreiben.
Bei einem Button klick soll eine Zufallszahl(z.B 5) erzeugt werden.Mit dieser spring ich dann in eine Methode in der aus einer Liste das fünfte Objekt ausgelesen und zurückgegeben werden soll.Dann soll ein andere Button als Text den Wert aus der Liste bekommen.
So habe ich das gelöst:

final Button rightbutton=(Button)findViewById(R.id.buttonright);

    final Button startbutton=(Button)findViewById(R.id.startbutton);
    startbutton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Button startbutton = (Button) findViewById(R.id.startbutton);

            Random randnum = new Random();

            int randnumber = randnum.nextInt(6);
            String newword=newerword(randnumber);
            rightbutton.setText(newword);

        }
    });

public static String newerword(int number) {

    ArrayList<String> listwords = new ArrayList<String>();
    listwords.add(1, "hallo");
    listwords.add(2, "tag");
    listwords.add(3, "mittwoch");
    listwords.add(4, "donnerstag");
    listwords.add(5, "freitag");
    listwords.add(6, "samstag");
    String daswort =listwords.get(number);
    return daswort;


}

Der Compilier meckert nicht rum .Aber sobald ich auf den Button klicke stürtzt das Programm ab.Geht es nicht das man vom onclick raus und wieder reinspringt oder woran liegt das? Ich bin für jede Hilfe sehr dankbar.

Ich danke euch schonmal vielmals für eure Hilfe.

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

07.10.2015, 13:39:50 via App

Was sagt denn LogCat?

— geändert am 07.10.2015, 13:39:58

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

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 14:15:36 via Website

Ich teste das ganze au einem Samsung Galaxy S6.HAbe jetzt mal die errors ausgeben lassen.Es muss irgendwas mit dem aufrufen der methode zutun haben.Weil wenn ich einfach direkt im onclick den namen des Button ändere,funktioniert das ohne Probleme.

10-07 14:13:15.441: E/AffinityControl(14657): AffinityControl: registerfunction enter
10-07 14:13:16.081: E/AffinityControl(14670): AffinityControl: registerfunction enter
10-07 14:13:16.121: E/ActivityManager(3701): checkUser: useridlist=null, currentuser=0
10-07 14:13:16.121: E/ActivityManager(3701): checkUser: useridlist=null, currentuser=0
10-07 14:13:16.121: E/ActivityManager(3701): checkUser: useridlist=null, currentuser=0
10-07 14:13:16.121: E/ActivityManager(3701): checkUser: useridlist=null, currentuser=0
10-07 14:13:16.131: E/Zygote(14680): MountEmulatedStorage()
10-07 14:13:16.131: E/Zygote(14680): v2
10-07 14:13:16.131: E/Zygote(14680): accessInfo : 0
10-07 14:13:16.131: E/SELinux(14680): [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
10-07 14:13:16.621: E/Watchdog(3701): !@Sync 7687 [10-07 14:13:16.637]
10-07 14:13:26.061: E/AndroidRuntime(14680): FATAL EXCEPTION: main
10-07 14:13:26.061: E/AndroidRuntime(14680): Process: com.example.strooja.test, PID: 14680
10-07 14:13:26.061: E/AndroidRuntime(14680): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
10-07 14:13:26.061: E/AndroidRuntime(14680): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
10-07 14:13:26.061: E/AndroidRuntime(14680): at java.util.ArrayList.add(ArrayList.java:147)
10-07 14:13:26.061: E/AndroidRuntime(14680): at com.example.strooja.test.MainActivity.vocablefails(MainActivity.java:136)
10-07 14:13:26.061: E/AndroidRuntime(14680): at com.example.strooja.test.MainActivity$2.onClick(MainActivity.java:54)
10-07 14:13:26.061: E/AndroidRuntime(14680): at android.view.View.performClick(View.java:5254)
10-07 14:13:26.061: E/AndroidRuntime(14680): at android.view.View$PerformClick.run(View.java:21179)
10-07 14:13:26.061: E/AndroidRuntime(14680): at android.os.Handler.handleCallback(Handler.java:739)
10-07 14:13:26.061: E/AndroidRuntime(14680): at android.os.Handler.dispatchMessage(Handler.java:95)
10-07 14:13:26.061: E/AndroidRuntime(14680): at android.os.Looper.loop(Looper.java:145)
10-07 14:13:26.061: E/AndroidRuntime(14680): at android.app.ActivityThread.main(ActivityThread.java:6837)
10-07 14:13:26.061: E/AndroidRuntime(14680): at java.lang.reflect.Method.invoke(Native Method)
10-07 14:13:26.061: E/AndroidRuntime(14680): at java.lang.reflect.Method.invoke(Method.java:372)
10-07 14:13:26.061: E/AndroidRuntime(14680): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
10-07 14:13:26.061: E/AndroidRuntime(14680): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
10-07 14:13:26.361: E/android.os.Debug(3701): ro.product_ship = true
10-07 14:13:26.361: E/android.os.Debug(3701): ro.debug_level = 0x4f4c
10-07 14:13:26.901: E/SQLiteLog(12757): (284) automatic index on crash_info_summary(package_name_touched)
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225660
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcaf71e00
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225662
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcaf71f90
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225670
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xccfee490
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225685
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xccfee9e0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225688
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xccfeec80
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225690
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xccfeed70
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225692
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xccfeee70
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225694
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xccfeef40
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225696
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ff050
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225699
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ff1a0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225701
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ff2a0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225703
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ff3b0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225705
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ff4b0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225726
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ffc10
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225728
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ffcc0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225732
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ffe40
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225734
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3fff10
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225736
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3fffb0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225738
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xce959090
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225740
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xce959150
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225742
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xce959210
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225744
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xce9592e0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225746
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xce959360
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225705
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xcd3ff4b0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225748
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xce9595b0
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->resourceId=225754
10-07 14:13:27.331: E/image-factory(6682): ImageFactory::Load() ticket->typePath.type=0xce959750

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

07.10.2015, 14:46:00 via Website

Ich denke listwords.add(1, "hallo"); ist das Problem.
Du kannst nicht an Position 1 (das ist eigentlich die zweite, da der Index bei 0 beginnt) einfügen, wenn die Liste leer ist.

Nimm einfach nur add(item) ohne position, dann fügt er immer hinten an.
Das nextInt würde ich mit (list.size()) parametrisieren, nicht mit einem Literal.

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Jan S

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

07.10.2015, 14:47:53 via Website

Noch ein paar Anmerkungen zur "B-Note": Es macht keinen Sinn, die Liste in der Methode immer und immer wieder gleich zu initialisieren. Gleiches gilt für den Zufallszahlengenerator.

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Jan S

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

07.10.2015, 14:55:19 via App

Lass die Liste weg und ersetz diese durch ein Switch/case dann wird es funktionieren

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

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 15:00:36 via Website

OH MEIN GOTT.Was für ein selten dummer Fehler.Danke für die Hilfe.

Zu deinen Anmerkungen.Wie meinst du das mit der Liste immer wieder zu initialisieren?Wollte die erst unter oncreate erstellen .Aber ich hab dann in der Methode keinen Zugriff mehr drauf. Muss wieder reinkommen mit den ganzen Zugriffen und wo man auf was zugriff hat.

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

07.10.2015, 15:31:08 via Website

Naja, ich gehe mal davon aus, dass der Inhalt der Liste dynamisch wird - auf Basis des Stacktraces nehme ich an, dass da Vokabeln reinkommen.
Switch/case dürfte somit keine Alternative sein, da dies die Elemente zur Compilezeit fixieren würde.

Du deklarierst Instanzvariablen deiner Activity:

private final List<String> mVocabulary = new ArrayList<>();
private final Random mRandom = new Random();

Damit ist die Liste fix - nicht aber ihr Inhalt. Liste und Zufallszahlengenerator sind dann innerhalb der Klasse verfügbar.
Wo auch immer es im Lebenszyklus Deiner Acitvity passt, änderst Du den Inhalt der Liste, z.B. könntest Du in der onCreateeine Erstbefüllung machen:

//...
mVocabulary.clear(); // ggf. Paranoia - sorgt für definierten (leeren) Zustand
mVocabulary.addAll(Arrays.asList("tralala", "hallo", "ganz", "viele", "vokabeln", "usw"));

Dein onClick sieht dann so aus:

final Button startbutton=(Button)findViewById(R.id.startbutton);
startbutton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String newword=mVocabularity.get(mRandom.nextInt(mVocabularity.size()));
        rightbutton.setText(newword);
    }
});

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Jan S

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

07.10.2015, 15:37:13 via Website

Um Deine Rückfrage noch konkret zu beantworten: Die Erzeugung einer - immer gleichen - Liste innerhalb Deiner Methode newerword(int number) war ziemlich zweifelhaft.
In diesem Fall scheint mir die Liste zum Zustand Deiner Activity zu gehören - deshalb ist eine Instanzvariable die richtige Wahl.

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 15:44:27 via Website

Ah ok super danke.So werde ich das mal probieren.Also die Liste musst nich variabel sein,also nachdem die Liste ienmal erzeugt wurde muss kein Wert mehr hinzugefügt werden.Ich möchte ja im prinzipp zwei Lange listen haben die ich dann benutze.Wenn jede Liste so 5000 einträge hat .Gibt es dann nen smarteren Weg als ne Liste?

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

07.10.2015, 15:52:30 via Website

Naja, wenn es sich tatsächlich um Vokabeln handelt würde sich ggf. eine Map mit String Schlüsseln und String Werten anbieten - dabei kommt man dann bei "Teekesselchen" jedoch an die Grenzen. Himmel kann sky oder heaven sein - je nach Kontext.

Bei einer randomisierten Auswahl aus zwei Listen hast Du aber auch ein Problem mit Teekesselchen: Du findest halt entweder das Paar Himmel -> sky oder das Paar Himmel -> heaven. Gibt der User dann die andere mögliche Übersetzung ein, wird er zu Unrecht bestraft.

Am vollständigsten wäre wohl

Map<String, List<String>>

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Jan S

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

07.10.2015, 17:44:10 via Website

Da dein Problem nun gelöst ist, setze deinen Thread bitte auf beantwortet, indem du im Browser über deinem ersten post auf "Mehr"->"Beantwortet" klickst.

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

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 19:47:45 via Website

Ah ok.Hab mir jetzt aber überlegt das man die Sachen vielleicht besser in einer txt Datei speichert.Da kann man dann noch mehr Daten hinterlegen.Ich habe da nach einem Video gearbeitet und das dabei rausbekommen.

String Message="Hallo neues File";
String filename="testfile";
try {
FileOutputStream fileOutputStream=openFileOutput(filename,MODE_PRIVATE);
fileOutputStream.write(Message.getBytes());
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

Wenn er das aufm Emulator testet klappt das.Ich teste es aber immer direkt aufm Handy und da stürtzt es ab.Muss man nicht auch irgendwie erstmal angeben wo das File gespeichert werden soll?Wenn ja kann mir jemand vielleicht sagen wie das geht

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

07.10.2015, 19:50:04 via Website

Was ist denn da der LogCat fehler?
Hast du die Permission gesetzt? Bzw in welchen Pfad speicherst du die Datei?

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

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 19:59:31 via Website

mh ja genau das wüsste ich gern^^.In dem Video funktioniert das scheinbar so bei ihm und ich wundere mich das er nirgendwo angibt wo die Datei hingespeichert wird.Ich würde die Datei zum Beispiel gerne im Download Ordner auf meinem Handy speichern,Von Windows aus wäre das der Pfad

Computer\Galaxy S6\Phone\Download

Könnt ihr mir sagen wie ich das festlege?

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

07.10.2015, 20:00:26 via Website

Schau mal hier:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

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

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 20:06:06 via Website

Meine Permission sieht so aus:

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">

geht das so?

Wo soll ich deine Zeile genau hinzufügen?Was ist das Environment genau?

— geändert am 07.10.2015, 20:10:59

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

07.10.2015, 20:12:50 via Website

Ja die Permission stimmt so :)

Und die Zeile gibt dir den Pfad zum Downloadordner aus, d.h du musst das vor deinen Dateinamen basteln.
Und das "Envroiment" sind die der Name schon sagt eine Klasse ver verscheide "Umwltdinge in android" ;)
Da bekommst du deine Pfade ausgegeben etc.

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

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 20:35:02 via Website

mhhhhhhhh hab das jetzt so gemacht.

String Message="Hallo neues File";
String fname="testfile";
String path= String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
String filename=path+fname;
try {
FileOutputStream fileOutputStream=openFileOutput(filename,MODE_PRIVATE);
fileOutputStream.write(Message.getBytes());
fileOutputStream.close();

klappt aber immer noch nicht .Muss ich den path erst als File speichern und dann umwandeln oder wie macht man das?

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

07.10.2015, 20:50:59 via App

Gib mal den Pfad im log aus wie sieht der denn aus

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

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 20:58:47 via Website

Hab das nie mit dem LOG gemacht .Wie genau geht das.

Hab mir das jetzt einfach schnell in nem Feld anzeigen lassen.NAchdem ich den File Name verändert habe.Ist der Pfad jetzt richtig.

String Message="Hallo neues File";
String fname="/testfile";
String path= String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
String filename=path+fname;
try {
FileOutputStream fileOutputStream=openFileOutput(filename,MODE_PRIVATE);
fileOutputStream.write(Message.getBytes());
fileOutputStream.close();

/STORAGE/EMULATED/0/DOWNLOAD/TESTFILE

Muss man das txt selber auch noch anhängen oder kommt das automatisch

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

07.10.2015, 21:15:35 via App

Das mit dem txt muss man auch selber anhängen. Ind dss mit dem Log geht ganz einfach per Log.d(...)

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

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 21:38:17 via Website

Alsoo habs jetzt hinbekommen.Man muss genau einen Pfad angeben den es schon gibt also dieses extra Ordner unter Downloads den ich angebe war das Problem.Kann man irgendwie einen Pfad angeben und die fehlenden Ordner werden automatisch erstellt.So wie Whatsapp oder so ja auch einfach nen Ordner erstellt.

Oder löst man das irgendwie beim installieren der App?Ich mein ich möchte ja eigentlich nur das nach der Installation der App.Ein Ordner existiert auf dem Handy mit einer Textdatei drin, auf die ich zugreifen kann. DAs macht ja mehr Sinn die beim installieren zu erstellen anstatt beim ersten Start der App . Das würde ja bedeuten das ich alle Sachen aus der Textfile in den Quellcode schreiben müsste.Das macht sie ja unnötig groß.

Antworten
Rexxar
  • Forum-Beiträge: 2.563

07.10.2015, 22:02:55 via App

Morgen oder so schick ich dir mal meine Methode zum speichern einer txt Datei.
Zwar nicht aus der App Programmierung, aber auch Java.

Liebe Grüße, Rexxar :)
Moto Z Play Stock
Nvidia Shield Tablet K1
http://www.androidpit.de/forum/634540/allgemeines-faq-fuer-neulinge

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

07.10.2015, 22:08:44 via Website

cool vielen dank .Kann ja eigentlich auch nicht so schwer sein ^^^:D

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

08.10.2015, 07:17:39 via Website

Achtung:

<RANT>

Aus meiner Sicht gilt: Faulheit ist erste Pflicht beim Programmieren! Lieber erst 10 Minuten denken und dann das richtige Machen, als kopflos der nächstbesten Idee folgen.

Ich meine - was passiert hier grade? Ich will Daten aus meinem Programm raus haben (das ist richtig!) und entscheide mich dafür, sie in einem File vorzuhalten (das ist ok).
Was tue ich? Ich schreibe die Daten mit meinem Programm in die Datei, um sie hinterher in meinem Programm wieder einzulesen? (das sollte offensichtlich falsch sein)

Richtiger wäre wohl, der App die Datei (die ich dann schön selber in einem Editor erstelle) als ein "Asset" mitzugeben - siehe AssetManager.

...und was passiert währenddessen in der Nebenhandlung? Da reitet einer in eine offensichtlich falsche Richtung und bekommt auch noch Tipps, wie er das Pferd schneller macht.

Mein Vorschlag wäre,

  • Datei erstellen und unter Assets ablegen
  • per AssetManager.open einen InputStreamerzeugen, so dass ich die Datei auslesen kann.
  • dann Datei per commons-io (und nicht etwa mit einer selbstgestrickten Methode) einlesen, dazu gleich mehr

Bevor ich selber 30 Minuten in die Realisierung investiere, das ganz, ganz, ganz sicher schon 3 Millionen Programmierer auch machen mussten und dann dabei einen Bug baue, der mich hinterher nochmal 60 Minuten kostet, suche ich lieber 30 Minuten nach einer geeigneten Bibliothek, die mir das Leben leichter macht.

In diesem Fall beispielsweise könnte man z.B. commons-io verwenden (die commons Bibliotheken von Apache sind fast alle einen Blick wert).
Dazu fügt man in die Datei app/build.gradle eine neue dependency ein, z.B. so:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // ... ggf. andere dependencies und zusätzlich folgende Zeile
    compile 'commons-io:commons-io:2.4'
}

Dann kommt der Hinweis, dass die Gradle Files neu synchronisiert werden müssen - das tut man dann auch.

Das sollte commons-io runterladen und als Bibliothek einbinden.
Ab jetzt kann man einen File wie folgt zu eingelesenen Zeilen umwandeln:

// an einem geeigneten Platz in meiner Activity, z.B. onCreate
InputStream is = null;
List<String> content = null;
try {
    final AssetManager assetManager = getAssets();
    is = assetManager.open("wie_auch_immer_die_datei_heisst.txt");
    content = IOUtils.readLines(is);
} catch (final IOException exc) {
    // vermutlich ist das katastrophal für meine App und sollte nie, nie, nie vorkommen
    // Rausbomben ist also o.k.
    throw new IllegalStateException(exc);
} finally {
    IOUtils.closeQuietly(is);
}

</RANT>

— geändert am 08.10.2015, 07:23:36

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

08.10.2015, 11:29:16 via Website

Danke für deine Hilfe.Das mit dem Asset hatte ich ja gesucht nur wusste ich halt nicht wie das unter java heißt.Deswegen hab ich immer was in die richtung gesucht."android studio datei erstellen bei app installation" Da kam dann natürlich nur mist raus. Aber jetzt weiß ich ja wie es heißt und weiß wie ich weiterarbeiten muss. Danke nochmal für die Hilfe an alle.

Antworten
Rexxar
  • Forum-Beiträge: 2.563

12.10.2015, 17:49:57 via Website

Da ich es versprochen, und leider vergessen hatte, hier nochmal meine Java Methode:

public void logToFile(String message)
{

    try
    {
        File dataFolder = getDataFolder();

        if(!dataFolder.exists())
        {
            dataFolder.mkdir();
        }

        File saveTo = new File(getDataFolder(), "log.txt");
        if (!saveTo.exists())
        {
            saveTo.createNewFile();
        }

        FileWriter fw = new FileWriter(saveTo, true);
        PrintWriter pw = new PrintWriter(fw);
        Date now = new Date();           
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");          
        String time = "[" + format.format(now) + "] ";
        pw.println(time + message);
        pw.flush();
        pw.close();

    } catch (IOException e)
    {
        e.printStackTrace();
    }

}

Man sollte beachteen, dass getDataFolder(); Bukkit/Spigot spezifisch ist und so nicht übernommen werden kann. Also man müsste anders an den Zielordner kommen :D
Aber ist ja eh schon gelöst, ich bring das nur mal als Anregung ein.

Liebe Grüße, Rexxar :)
Moto Z Play Stock
Nvidia Shield Tablet K1
http://www.androidpit.de/forum/634540/allgemeines-faq-fuer-neulinge

Jan S

Antworten
Stephan
  • Forum-Beiträge: 43

15.10.2015, 11:19:41 via Website

Für deine Zahlen .

final ImageButton button = (ImageButton) findViewById(R.id.imageButton);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {

            Random randomGenerator = new Random();
            int randomInt = randomGenerator.nextInt(5) + 1;                             Immer die linke Zahl ändern wo die 5 steht bei Case 10 dann die 10                 


            //picking the right sound to play
            switch (randomInt) {

case 1:
edit.setText(R.string.beispiel); oder hier einfach nur edit.setText("1");

                    break;

case 2:
edit.setText(R.string.beispiel); oder hier einfach nur edit.setText("2");

                    break;

case 3:
edit.setText(R.string.beispiel); oder hier einfach nur edit.setText("3");

                    break;

case 4:
edit.setText(R.string.beispiel); oder hier einfach nur edit.setText("4");

                    break;

case 5:
edit.setText(R.string.beispiel); oder hier einfach nur edit.setText("5");

                    break;

            }
        }
    });

— geändert am 19.10.2015, 16:24:50

Antworten