IlligalStateException

Unmitelbar nachdem eine Activity beendet und die nächste gestartet wurde, wurde ein Fragment geöffnet. Das Resultat:

IlligalStateException

Die Lösung des Problems wird dort, auf StackOverflow ausführlich besprochen (Letzter Aufruf 28.5.2018).

Für mich hat das die Lösung gebracht:

Der Folgende Code sollte erst dann aufgerufen werden, wenn OnResume() aufgerufen wurde:

FragmentManager fm = getSupportFragmentManager();
FragmentTextInputDialog yn = FragmentTextInputDialog.newInstance("ss");
yn.show(fm, "fragment_text_input_dialog");

 

Advertisements

Text formatieren und färben…

Quickie, Escape Sequenzen zum einfärben und formatieren von Text in der Shell findet man dort:

https://misc.flogisoft.com/bash/tip_colors_and_formatting (Letzter Aufruf 23.5.2018).

Habe ich unter OS X 10.9.5 (13F34) im Terminal getestet, funktioniert:

Screen Shot 2018-05-23 at 10.03.50 PM

Regex……

Regular Expressions (kurz: regex) sind einzelne Zeichen oder Zeichenketten mit denen man dazu passende Zeichenfolgen in einer Datei oder der Ausgabe eines Programms suchen kann.

Regex lassen sich mit Unixoiden Tools wie grep oder egrep nutzen, oder in Programmiersprachen die das unterstützen, zu den letzteren zählt u.a. Java.

ls * oder dir *.txt dürfte zu den verbreitetsten Anwendungen von regex’en zählen. Das „*“ – Zeichen bzw. die Zeichenkette „*.txt“ bilden die Suchvorschrift nach der die passende Zeichenketten ausgegeben werden.

Grundlagen
Alle hier vorgestellten Beispiele habe ich unter Mac OS X 10.9.5 im Terminal getestet.

Das Tool grep unterstützt unter Mac OS nicht den vollen Umfang der regex. Ich empfehle deshalb egrep zu benutzen, damit können auch umfangreichere Ausdrücke verarbeitet werden.

Wenn etwas verlinkt ist, dann war der letzte Aufruf = Stand dieses Posts.

Beispiele
Kurz und schlank, eine Erklärung folgt irgendwann….

Grundlegender Syntax:

egrep "regex" suchtext.txt

Telefonnummern finden:

egrep "0[0-9]{3}-[0-9]{3,15}" testFile.txt

Findet Telefonnummern, ohne internationale Vorwahl.

Shell Quotes

Meta- Zeichen Unixoider Systeme sind unter Anderem das ‚*‘ oder ‚?‘- Zeichen, beispielsweise im Zusammenspiel mit dem ‚ls‘ Kommando. 

Möchte man solche Zeichen aber in der Ausgabe mit ‚echo‘ oder ‚printf‘ zur Ausgabe benutzen, dann muss man das dem Interpreter der Shell sagen. Das geht indem man dem Zeichen entweder ein ‚\‘ voranstellt oder es in die ‚ bzw. “ Zeichen einschließt:

echo \*

echo ‚*‘

echo „*“

Diese Technik wird als Quoting bezeichnet. Alle drei der oben gezeigten Methoden machen im Prinzip das Selbe. Der Unterschied ist der:

\
Ist die stärkste Form des Quoting.  Für einzelne Zeichen.

 


Strong Quoting
Alle Zeichen werden ausgegeben, auch das ‚$‘. Das heist, Inhalte von Variablen werden nicht berücksichtigt: echo ‚$Hallo‘ hat ‚$Hallo‘ zum Ergebnis.

 


Weak Quoting
Wenn man Meta- Zeichen ausgeben möchte, aber die Inhalte von Variablen und Kommandos (zwischen den ` Zeichen) berücksichtigen möchte, dann sollte man diese Form benutzen: echo „Hallo das ist der Inhalt von $i“. Gibt den angegebenen Text und den Inhalt der Variablen ‚i‘ aus. wenn Sie das so machen: echo ‚Hallo das ist der Inhalt von $i‘ dann ist das Ergebnis: Hallo das ist der Inhalt von $i.

Eine spezielle Bedeutung dabei hat das ` – Zeichen. Es wird nicht als Quote verstanden, sondern als  Kommando- Ersatz:

echo Sie sind im Verzeichnis: `ls`

oder etwa:

echo Heute ist der `date`

 

 

Strings ändern, Unixoide Tools

Zur Verarbeitung von Zeichenketten (Strings) stellen Unixoide System traditionell einige Werkzeuge zur Verfügung. Ich beschreibe hier ein paar davon im Hinblick auf deren Einsatz- Zweck und die jeweiligen Grenzen. Ich bleibe dabei oberflächlich, das geschriebene soll für jedes der Werkzeuge einen Schnelleinstieg möglich machen und ein Gefühl für den Syntax vermitteln.

Grundlagen

Wenn links wiedergegeben werden, dann entspricht das Datum des letzten Aufrufs dem jeweiligen Bearbeitungsstand dieses Blogeintrages.

Alle Beispiele wurden auf einem Mac- Book Pro unter Mac OS X getestet.

Grundsätzlich sind die hier vorgestellten Werkzeuge dazu da, Zeichenketten zu verändern. Andere wichtige, hier nicht behandelte Werkzeuge dienen lediglich der Auswertung von Zeichenketten. Die wichtigsten sind: grep (oft zusammen mit Regulären Ausdrücken: —regexp) und find.

Alle Werkzeuge lesen Zeichen aus einem Eingabestrom (einer Datei) und geben das Ergebniss auf stdout aus. arbeiten nahtlos mit Umleitungen „>“ , „>>“ oder Pipes „|“ zusammen.

tr

Steht für Translate. Eignet sich immer dann, wenn man einzelne Zeichen ändern möchte. Man kann zwar mehr als ein zu änderndes oder zu löschendes Zeichen angeben, die werden aber nicht als zusammenhängendes Wort interpretiert, sondern bleiben einzelne Buchstaben

tr 'a' 'b' < Datei.txt

Wandelt alle „a“ aus der Eingabe Datei in ein „b“ in der Ausgabe.

tr -d 'a' < Datei.txt

„-d“ führt dazu dass alle „a“ gelöscht werden.

tr 'abcd'  'jklm' < Datei.txt

Wenn mehr als ein Zeichen angegeben wird , dann schreibt man die in Anführungszeichen. Hier werden der Reihe nach, alle Buchstaben im ersten Argument durch die Buchstaben im zweiten ersetzt.

Als Bereichs Kennzeichnung darf „-“ benutzt werden: „a-z“ meint alle Zeichen zwischen „a“ und „z“.

Spezielle Zeichen müssen mit „\“ escaped werden: „\n“, „\t“, „\\“ usw.

sed

Abkürzung für Stream Editor. Zwingend, wenn man mehr als ein Zeichen manipulieren möchte. Erlaubt Reguläre Ausdrücke.

sed 's/Hallo/hi/g' test.txt > changed.txt

Ersetz alle „Hallo“ in „test.txt“ nach „hi“ und schreibt das Ergebnis in die Datei „changed.txt“. Das „s“ vor dem ersten „/“ heist ’substitute‘ das „g“ nach dem letzten „/“ heist „globally“ und meint das alle in „test.txt“ vorkommenden „Hallo“ ersetz werden sollen. Wenn man das „g“ weglässt, wird jeweils nur das erste in einer Zeile vorkommende „Hallo“ ersetzt.

awk

Mächtig, Vorfahre von Perl. Wie sed für die Manipulation längerer Zeichenketten geeignet. Wichtigstes Merkmal: Arbeiten Zeilen und Spaltenorientiert. Das heist, eine Zeile wird aus der Eingabe bis „/n“ gelesen. Die Leerzeichen werden als Trenner zwischen den Spalten interpretiert. Die Spalten lassen sich mit „$n“ auslesen.

EditText und der scheinbar gespeicherte Inhalt

…wäre schön wenn dem so wäre.

Wenn eine Activity die ein, oder mehrere EditText– Felder enthält   verlassen und danach wieder gestartet wird, dann bleibt der Inhalt der Felder scheinbar erhalten. Greift man dann aber mit xx.getText().toString() den vermeitlich erhaltenen Inhalt ab, ist das Ergebnis ein leerer String.

Die Erkentniss:

Am onSaveInstanceState() führt kein Weg vorbei,wenn man den Inhalt besagter Felder über den Lebenszyklus ihrer Activity hinaus retten möchte.

Focus lost..

Die Folgende Fehlermeldung hatte ich erhalten:

W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=202.125, y[0]=1358.5625, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=5879866, downTime=5875801, deviceId=0, source=0x1002 }

Das Resultat: In der auslösenden Activity wurde der der Klick auf den dort eingebaute Floating Action Button (fab) nicht mehr erkannt, satt dessen, Fehler wie oben beschrieben.

Der Grund:


setContentView(R.layout.activity_new_score);

wurde zweimal aufgerufen. Einmal in on Create() und das zweite Mal in onResume(). Nachdem ich den Befehl in onResume() entfernt hatte, war der Fehler verschwunden und das anklicken des fab wieder erkannt.

Android+ Big Data

Anbei ein paar Notizen zum Umgang mit großen Dateien.

Ich wollte wissen, wie man eine App schreibt, die eine Datenbank mitbringt, ohne das sich der Benutzer eine Datei selber herunterladen muss. Mein Ansatz war eine Datenbank die eine Sternenkarte enthält. Benutzt habe ich dazu die H2- Engine. Größe der Datenbank ca. 134MB.

Erster Versuch: Die Datenbank in den Assests Folder ablegen und von da, beim Start der App, in das Dateisystem kopieren. Das hat keinen Sinn gemacht, es funktioniert zwar, aber verdammt langsam!

Zweiter Versuch: Die Datenbank als Datei in das Filesystem geschrieben (Data/Data….) und beim Start der App geladen. Dauert zwar immer noch relativ lange, aber, es passiert in einer einigermaßen vertretbarer Zeitspanne. Da ist aber noch Optimierungsbedarf! Denn, auch wenn das Gerät gedreht wird, muss wieder gewartet werden.