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

GIT- Schnellstart

Wie geht GIT, kurz und knapp zum Schnelleinstieg.

Abstrakt

Zu GIT gibt es im Netz eine Fülle an detaillierten Tutorials und Guides zum Schnelleinstieg. In diesem Artikel sind meine eigenen Erfahrungen dazu wiedergegeben, praxisorientiert mit den Dingen die ich im Moment nützlich finde und brauche.

Grundlagen

Alle Links in diesem Artikel wurden am 20.11.2017 zuletzt abgerufen. Ich beschränke mich hier lediglich auf das Arbeiten mit einem sogenannten lokalen repository. Wenn Sie GIT installiert haben, dann gehen Sie in die Konsole ihres Systems und geben ein:

git –version

Vergleichen Sie die Ausgabe mit der von mir genutzten Version:

git version 1.8.5.2 (Apple Git-48)

Sie sehen, ich habe einen Macintosh. Sollte irgendwo hier etwas anderes zutreffen, erwähne ich es.

Wenn ich mich auf Android Studio beziehe, dann meine ich damit die Version 2.3.3

Shell, neues repository anlegen

Im Verzeichnis, in dem wir künftig arbeiten wollen geben wir zunächst ein:

git init

Damit hätten wir die GIT- Kontrolle für diese Verzeichnis eingeschaltet, oder, in der GIT- Terminologie: Das Verzeichnis enthält nun ein GIT- repository. Wenn wir nun eingeben:

git status

Dann können zwei Dinge passieren. Erstens, das Verzeichnis entält ein GIT repositiory:

Initial commit

Untracked files:

(use „git add <file>…“ to include in what will be committed)

Hallo.class

Hallo.java

nothing added to commit but untracked files present (use „git add“ to track)

Zweitens: Das aktuelle Verzeichnis, oder eines der „Eltern“ davon enthält kein GIT repository:

fatal: Not a git repository (or any of the parent directories): .git

Die vorletzte Ausgabe zeigt uns schon, dass GIT sehr freundlich ist und uns sagt, was zu tun ist nähmlich, das Sie eine Datei deren Änderungsstand Sie überwachen und dokumentiert haben möchten mit ‚add‘ anmelden müssen:

git add <datei>

Wenn Sie das gemacht haben, sagt ihnen GIT nach erneuter Statusabfrage das:

Changes to be committed:

(use „git rm –cached <file>…“ to unstage)

new file:   Hallo.java

Untracked files:

(use „git add <file>…“ to include in what will be committed)

Hallo.class

Die Datei ‚Hallo.java‘ ist angemeldet. In GIT heist das, dass sich diese Datei in der sogenannten Staging Area befindet. GIT sagt uns auch gleich was zu tun ist, wenn ich die Datei nicht mehr dort haben möchte (‚rm –cached <Datei>).

Alle Dateien in der Staging Area werden nach dem „commit’en“ mit ihren Änderungen protokolliert. Das Schaut dann so aus:

git commit

Ich habe mir in der GIT- Konfiguration den Emacs als Standard Editor eingestellt. Wenn Sie das auch gemacht haben (irgend ein anderer, wenn es sein muss auch Vi, geht auch) dann startet der und Sie können eine Commit Message eingeben. Nach dem Verlassen des Editors, ist der commit erledigt und GIT antwortet:

[master (root-commit) 258ae40] Erste Version

1 file changed, 12 insertions(+)

create mode 100644 Hallo.java

Die erste Zeile wiederholt nochmals ihre Commit Message. Interessant ist das, was davor steht: master…….

In GIT können Sie parallel zu ihren jeweiligen Datei- Versionen, parallele Arbeitstände bearbeiten. Diese Parallel Versionen werden in GIT Branches genannt. Es lassen sich beliebige viele Branches anlegen und zu jedem Zeitpunkt wieder vereinen.

 

Die Ausgabe oben sagt uns, das wir die Datei ‚Hallo.java‘ im standardmäßig angelegten Branch ‚Master‘ commitet haben.

Branches

Einen neuen Branch können Sie mit:

git branch neuerBranch

Sie befinden Sich danach immer noch in ihrem Branch ‚Master‘. Sie wechseln mit:

git checkout neuerBranch

M Hallo.java

Switched to branch ’neuerBranch‘

Dieser Branch ist jungfräulich und Sie müssen die Eingangs beschrieben Schritte zum commiten wiederholen. Alle Änderungen werden nun aber nur in ihrem ’neuerBranch‘ protokoliert. Das betrifft auch jede Datei die Sie ändern. Wenn Sie in einen anderen Branch wechseln, dann finden Sie dort den jeweilig anderen Arbeitsstand wieder. Das heist: Sie haben jetzt zwei Dateien die Sie unabhängig voneinander testen können.

Um eine Übersicht über alle Branches zu bekommen geben Sie ein:

git branch

master

* neuerBranch

Der aktive ist mit einem ‚*‘ markiert.

Wenn Sie die Änderungen zusammenführen möchten, dann machen Sie das So:

git merge master neuerBranch

Updating 258ae40..d92b0fa

Fast-forward

Hallo.java | 4 +++-

1 file changed, 3 insertions(+), 1 deletion(-)

Wenn Sie das jetzt nocheinmal machen, dann passiert folgendes:

git merge master neuerBranch

Already up-to-date.

Das heist, beide Branche’s sind synchron.
 

 

 

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.

(Hashes)Prinzip

Notiz: Ein Hash– Funktion verwandelt X nach Y. Zurück von Y nach X geht’s nimmer.Das letztere wäre der Fall wenn wir ein symmetrisches Kryptografie- Verfahren anwenden würden.

Nehmen wir an, wir möchten eine Zugangskontrolle – für eine Datenbank, eine Webseite etc. – bauen. Das ganze soll für mehrere Nutzer, jeder hat seinen eigenen usernamen und sein eigenes Passwort, funktionieren. Beides ist in einer Datenbank abgelegt. Da es sich um Sicherheitsrelevante Daten handelt, wäre es nicht sehr schlau, wenn das dort im Klartext stehen würde. Denn, ein Hexeditor gibt Aufschluss:

Screen Shot 2016-08-13 at 9.47.03 PM
Verdächtige Strings. Welche sind wohl eine  User/ Password Kombination?

Eine Hash- Funktion hilft. Nehmen wir an die Funktion heist H(x). x Sei eine Zeichenkette und H liefert dafür den Hashwert h zurück. Wenn man einen neuen user anlegt, berechnet man aus dem Password- String x den Wert h und legt nun h in der Datenbank ab. Das war es!

Das Selbe macht man beim Login. Wenn das Password eingegeben wurde berechnet man daraus wieder h und gleicht das mit der Datenbank ab. Ist h drin, dann ist das Password richtig.

Die Hash- Funktion ist umso besser, je unzweideutiger h ist. Zum Beispiel: Wird die Stellung der Zeichen im String nicht berücksichtigt, dann würde ‚abc‘ das Selbe h ergeben wie ‚cba‘. Nehmen wir an, die Menge der möglichen Eingabe- Strings sei unendlich, dann sollten auch unendlich viele h herauskommen und kein h sollte dem anderen gleichen. Die Kunst ist es nun eine für seine Zwecke möglichst brauchbare Funktion H zu finden.

 

 

 

Java, C++, Objective C

Das Konzept der Objektorientierten Programmierung spiegelt am ehesten die Art und Weise wieder wie wir denken. Klassen sind Blaupausen für Objekte die Eigenschaften und Funktionalitäten (Code) enthalten. Von einer Klasse können theoretisch beliebig viele Instanzen (Objekte) gebildet werden. Diese Objekte interagieren dann miteinander, ähnlich wie Funktionen bei den Prozeduralen Programmiersprachen. Der scheinbare Nachteil bei diesem Konzept ist, dass der Kontrollfluss in Programmmen nicht so leicht nachvollziehbar ist, wie das bei Prozeduralen Pogrammiersprachen der Fall ist.