Ich freue mich, dass du dir die Mühe gemacht hast, mir zu helfen diese App zu optimieren. Ich werde mich sofort darum kümmern und hoffe, dass ich in den nächsten Tagen fertig werde
MfG XoR
Ich freue mich, dass du dir die Mühe gemacht hast, mir zu helfen diese App zu optimieren. Ich werde mich sofort darum kümmern und hoffe, dass ich in den nächsten Tagen fertig werde
MfG XoR
Hallo allerseits.
Nach langer Zeit habe ich nun endlich meine erste App im Play Store veröffentlicht!
Diese App trägt den Namen "Stundenplan - YouPlan" und wie der Name schon vermuten lässt ist diese App für Schüler gedacht.
Mit ihr ist man in der Lage seinen kompletten Schulalltag zu managen(Stundenplan, Noten-/Fächerverwaltung, Hausaufgaben...).
Ich habe mich bemüht, diese App übersichtlich zu gestalten, sowie alle Funktionen, welche solch eine App mit sich bringen muss, bereitzustellen, sie aber dennoch schlicht zu halten.
Genaueres, wie Screenshots und eine detaillierte Beschreibung findet ihr natürlich im Play Store: Stundenplan - YouPlan
Was mich interessieren würde, wäre, was ihr positiv/negativ findet, was ihr eventuell anderst machen würdet, oder was euch in dieser App fehlt. Ich bin jederzeit für konstruktive Kritik offen, und freue mich auf euer Feedback!
MFG: XoR
Nach langem rumprobieren habe ich nun rausgefunden, dass das Problem keineswegs bei den FrameLayouts liegt, sondern anscheinend am Rückgabewert der Activity.
Zur besseren Verständlichkeit:
MeineMainActivity ruft durch Klick auf den "EinstellungsButton" eine Neue Activity (Settings) auf, in der man wie oben bereits erklärt bestimmte
Views aus- und einschalten kann(mit Hilfe von Checkboxen).Die werte der Checkboxen werden dann gespeichert, ein Rückgabewert wird ausgegeben und die Activity mit finish() beendet.
Nun fängt die MainActivity den Rückgabewert ab, und lädt die Views neu. Dies funktioniert nur solange ich Views ausschalte, doch wenn ich eines
wieder einschalten will stürtzt die App ab. Erwähnenswert ist noch, dass ich mittels AlertDialoge getestet habe, wie weit denn die App kommt
bevor sie abbricht. dies ist (nur beim erneuten aktivieren eines Views) Zeile 50(in Settings). Somit denke ich, dass der Fehler in der Methode
von MainActivity liegt (Zeile. 59), welche die RückgabeWerte abfängt/bearbeidet.
Hier noch mein Code:
CodeSchnippsel von MainActivity:
//#####################################################################
// OnCREATE ###########################################################
//#####################################################################
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
debug = new AlertDialog.Builder(this);
debug.setMessage("bin da").setCancelable(true);
debugText = debug.create();
debug2 = new AlertDialog.Builder(this);
debug2.setMessage("bin auch da").setCancelable(true);
debugText2 = debug2.create();
//Verbindung zum Speicher aufbauen
memory = getSharedPreferences("DATA", 0);
memoryEdit = memory.edit();
//Die einzelnen Views variablen zuweisen
uebersicht = (FrameLayout)findViewById(R.id.Uebersicht);
termine = (FrameLayout)findViewById(R.id.Termine);
stundenplan = (FrameLayout)findViewById(R.id.Stundenplan);
notenverwaltung = (FrameLayout)findViewById(R.id.Notenverwaltung);
//neuen GestenScanner
gestureScanner = new GestureDetector(this);
//Views an Variablen binden
flipper = (ViewFlipper)findViewById(R.id.flipper);
uebersicht_einstellungen = (FrameLayout)findViewById(R.id.uebersicht_einstellungen);
uebersicht_einstellungen.setOnClickListener(this);
stundenplan_einstellungen = (FrameLayout)findViewById(R.id.stundenplan_einstellungen);
stundenplan_einstellungen.setOnClickListener(this);
stundenplan_stundeAdd = (FrameLayout)findViewById(R.id.stundenplan_stundeAdd);
stundenplan_stundeAdd.setOnClickListener(this);
//Einstellungen Laden
loadSettings();
}
//#####################################################################
// RÜCKGABEWERT-ACTIVITY ##############################################
//#####################################################################
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1)
loadSettings();
}
//#####################################################################
// EINSTELLUNGEN LADEN ################################################
//#####################################################################
private void loadSettings() {
//Anzeige der Views individuell anzeigen
if(!memory.getBoolean("check_termine", false)) {
flipper.removeView(termine);
}
else {
if(!termine.getParent().equals(flipper)) {
flipper.addView(termine);
}
}
if(!memory.getBoolean("check_stundenplan", false))
flipper.removeView(stundenplan);
else {
if(!stundenplan.getParent().equals(flipper))
flipper.addView(stundenplan);
}
if(!memory.getBoolean("check_notenverwaltung", false))
flipper.removeView(notenverwaltung);
else {
if(!notenverwaltung.getParent().equals(flipper))
flipper.addView(notenverwaltung);
}
}
//#####################################################################
// OnClick-Methode ####################################################
//#####################################################################
@Override
public void onClick(View eventElement) {
if(eventElement.equals(uebersicht_einstellungen)) {
startActivityForResult(new Intent(this, Settings.class), 1);
}
else if(eventElement.equals(stundenplan_einstellungen)) {
startActivityForResult(new Intent(this, Settings.class), 1);
}
else if(eventElement.equals(stundenplan_stundeAdd))
startActivityForResult(new Intent(this, UnterrichtsStundeAdd.class), 2);
}
Alles anzeigen
CodeSchnippsel von Settings:
//#####################################################################
// OnCREATE ###########################################################
//#####################################################################
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
debug = new AlertDialog.Builder(this);
debug.setMessage("Settings: bin da").setCancelable(true);
debugText = debug.create();
memory = getSharedPreferences("DATA", 0);
memoryEdit = memory.edit();
check_stundenplan = (CheckBox)findViewById(R.id.check_stundenplan);
check_notenverwaltung = (CheckBox)findViewById(R.id.check_notenverwaltung);
check_termine = (CheckBox)findViewById(R.id.check_termine);
einstellungen_speichern = (Button)findViewById(R.id.einstllungen_speichern);
einstellungen_speichern.setOnClickListener(this);
loadSettings();
}
//#####################################################################
// OnClick-Methode ####################################################
//#####################################################################
@Override
public void onClick(View eventElement) {
if(eventElement.equals(einstellungen_speichern)) {
memoryEdit.putBoolean("check_stundenplan", check_stundenplan.isChecked());
memoryEdit.putBoolean("check_notenverwaltung", check_notenverwaltung.isChecked());
memoryEdit.putBoolean("check_termine", check_termine.isChecked());
memoryEdit.commit();
setResult(1);
finish();
}
}
//Beim erneuten Aufruf von Einstellungen, die Checkboxen so anzeigen, wie der Nutzer sie eingestellt hat
private void loadSettings() {
check_stundenplan.setChecked(memory.getBoolean("check_stundenplan", true));
check_notenverwaltung.setChecked(memory.getBoolean("check_notenverwaltung", true));
check_termine.setChecked(memory.getBoolean("check_termine", true));
}
}
Alles anzeigen
Ich Hoffe ihr findet meinen Fehler
Wie immer schon mal ein Dankeschön im Vorraus!
MfG XoR
Hi zusammen.
Ich habe einen ViewFlipper der zwischen verschiedenen Views hin- und herflippt. Durch Einstellungen kann man bestimmte Views "ausschalten" (removeView(View Child)) sodass dieses fortan nicht mehr angezeigt wird und nur noch zwischen den übrigen Views wechselt.
Da ich aber diese Einstellung auch wieder rückgängig machen kann/will (View soll fortan wieder angezeit werden) muss ich es wieder als Child vom ViewFlipper setzen (addView(View Child)), was auch funktioniert, wenn man die App nicht neu startet.
Wenn ich nun aber ein View (nennen wir es Child2) ausschalte, die App anschließend neu Starte und dann in den Einstellungen einstelle, dass Child2 fortan wieder angezeigt werden soll, stürzt die App ab.
Meine Vermutung war, dass Child2 nach dem Neustart erst gar nicht neu geladen wird, und ich es somit auch nicht wieder dem ViewFlipper als Child zuweisen kann.
Deshalb dachte ich mir, dass ich diese ganzen Views beim ersten mal starten der App im SharedPreferences
speicher, um sie somit immer wieder laden und dem ViewFlipper als Child zuweisen kann. Durch Google bin ich auf diese Seite gestoßen: eigene Objekte Speichern
Habe diese Methoden für FrameLayouts angepasst (meine zu wechselnde Views sind FrameLayouts):
//#####################################################################
// SERIALISIERUNG #####################################################
//#####################################################################
public static String objectToString(Object obj) {
String out = null;
if (obj != null) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
out = new String(Base64Coder.encode(baos.toByteArray()));
} catch (IOException e) {
return null;
}
}
return out;
}
public static Object stringToObject(String str) {
Object out = null;
if (str != null) {
try {
ByteArrayInputStream bios = new ByteArrayInputStream(Base64Coder.decode(str));
ObjectInputStream ois = new ObjectInputStream(bios);
out = ois.readObject();
} catch (IOException e) {
return null;
}catch (ClassNotFoundException e) {
return null;
}
}
return out;
}
public boolean storeMyData(FrameLayout myDataObject, String Dataname ) {
try {
String s = objectToString(myDataObject);
if(s != null && s.length() > 0) {
memoryEdit.putString(Dataname, s);
memoryEdit.commit();
return true;
}
return false;
}catch (Exception e) {
return false;
}
}
public FrameLayout loadMyData(String Dataname) {
if(memory.contains(Dataname)) {
String s = memory.getString(Dataname, "");
if(s.length() > 0) {
try {
return (FrameLayout) stringToObject(s);
}
catch (Exception e) {
return null;
}
}
}
return null;
}
Alles anzeigen
Dies hat - wie erwartet - nicht funktioniert, vermute zum Teil, da ich nicht in die Klassendefinition vom FrameLayout gekommen bin (vll. bin ich zu dumm) und es somit nicht implements Serializable machen konnte.
Ich Hoffe ihr hab eine Lösung, wie ich diese Views beim ersten mal ausführen der App speichern kann, oder bin ich mit meiner Vermutung total auf dem Holzweg?
Sorry wegen dem vielen Text
MfG XoR
So, nach langem Rumprobieren hab ich es dann doch endlich geschafft.
Habe einfach child2 als Kindelement von flipper entfernt: flipper.removeView(child2);
Vorher sollte man natürlich mit findViewById(...) ein View der Variablen child2 zuweisen
Ich denke die Lösung war einfach zu banal um sofort drauf zu kommen
MfG XoR.
Danke für deine schnelle Antwort Bengel.
Im Prinzip tut deine Lösung was sie soll, da ich aber das Wechseln der Views mit einer (ich nenn sie mal) SlideAnimation durchführe, sieht es dann nicht mehr ganz so 'flüssig' aus, weshalb ich für weitere Lösungen dankbar wäre
Guten Tag allerseits.
Ich versuche schon seit geraumer Zeit einzelne Elemente meines ViewFlippers zu deaktivieren.
Zur veranschaulichung meines Problems ist hier ein Bild des Grundgerüstes meiner App: Bild.
Wie schaffe ich es nun, beispielsweise child2 zu deaktivieren, so dass der ViewFlipper fortan nur noch zwichen child1 und child3 hin- und herflippt?
Hoffe auf schnelle Antwort und bedanke mich schon mal im Vorraus
MfG XoR.
Hallo liebe Community!
Wie die Überschrift schon verrät, benötige ich Hilfe um Wegfindung in meiner App zu implementieren.
Die Arbeitsweise von A* habe ich im Prinzip begriffen, doch die Umsetzung in einer App erschließt sich mir noch nicht so ganz. In mehreren Threads unterschiedlicher Plattformen ist immer von "Rechtecken" oder "Bereichen", welche auf begehbarkeit geprüft werden, die Rede. Doch was ich nun hoffe hier zu erfahren ist, was diese "Rechtecke" repräsentieren? Ist damit wirklich ein Rechteck gemeint, das bestimmt viele Pixel beinhaltet, oder schlicht und einfach nur EIN Pixel?
Sobald diese Frage geklärt wäre, stellt sich mir eine Andere: Wie bzw. nach welchem Schema wähle ich die "begehbaren" und "nicht begehbaren" Rechtecke aus, sodass die Wegfindung ihren Job erledigen kann?
Da der Weg in meiner App eine bestimmte Farbe hat, habe ich mir überlegt, von jedem Rechteck die Farbe auslesen zu lassen und danach zu entscheiden, ob er begehbar ist(Farbe gleich wie der Weg), oder nicht begehbar ist. Dennoch erscheint mir die Vorgehensweise viel zu umständlich und benötigt, so denke ich, unmengen an Rechenzeit. Zudem, was wenn der Weg nicht einfarbig ist? Somit wäre diese Vorgehensweise nicht brauchbar, weshalb ich sie als uneffizient erachte. Nun stellt sich die Frage, wie ich die Rechtecke sonst noch unterscheiden könnte?
Ich wäre sehr dankbar, wenn mir einer Aufschluss darüber geben könnte, was nun diese Rechtecke darstellen und nach welchem Schema ich diese anschließend als begehbar oder nicht begehbar selektiere.
Ich bedanke mich schon mal bei allen im Vorraus!
MFG XoR!