Stundenplan Layout

  • Antworten:74
Jakob N.
  • Forum-Beiträge: 282

19.07.2014, 13:29:39 via Website

Hallo Leute :)

Ich habe die App Untis installiert die wie ich finde ein sehr gutes Layout hat ;)

Ich will in meiner App auch einen kleinen Stundenplan einbauen der auch in etwa so ausschauen soll und auch ein Klick auf eine Zeile möglich sein soll.

Für alle die das Untis-Layout nicht kennen:
image

Weiß jemand wie ich dass realisieren kann?

LG Jakob

LG Jakob

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

19.07.2014, 14:45:36 via App

Auf jede Zeile in der Table einen Oncklick definieren.
Dieses klick muss javascript aufrufen das dann irgendwas macht.

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

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

19.07.2014, 14:46:11 via App

Auf jede Zeile in der Table einen Oncklick definieren.
Dieses klick muss javascript aufrufen das dann irgendwas macht.

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

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

19.07.2014, 14:46:13 via App

Sorry doppelpst

— geändert am 19.07.2014, 14:46:45

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

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

19.07.2014, 14:46:14 via App

Auf jede Zeile in der Table einen Oncklick definieren.
Dieses klick muss javascript aufrufen das dann irgendwas macht.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

19.07.2014, 17:32:00 via Website

Hatte mich in meiner Frage verschrieben ... Meinte einen Klick auf die Zelle.

LG Jakob

LG Jakob

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

20.07.2014, 06:45:35 via App

Da kannst du doch auch ein InClick im td festlegen. Oder geht das HTML mäsig nicht?

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.07.2014, 14:32:44 via App

Meinst du leicht dass die ganze Table eine Html-Seite is und in der App nur eine Webview? Wollte es offline auch bereitstellen.

LG Jakob

LG Jakob

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

20.07.2014, 14:36:46 via Website

Genau, ich dachte, dass du das genze in HTML machen willst, weil untis ja hauptsöchlich HTMLs generiert.
Für den Offline Modus könntest du die Seite auch cachen, aber wie man in einem Android Table Layout on clicks definiert, weiss ich nicht.
Vlt mal so probieren:
http://stackoverflow.com/questions/17943647/setting-onclicklistener-to-tablerow-with-textviews

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.07.2014, 18:01:50 via App

Das mit der HTML-Seite wär vielleicht eh nicht so eine schlechte Idee ;)

Wie kann ich die Seite cachen?

LG Jakob

LG Jakob

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

20.07.2014, 18:39:26 via Website

Den Quelltext z.b in den SheredPrefernces Zwischenspeichern und dann überprüfen..
Wenn Internet verfügbar, dann aus dem Inet sonst au dem Android Cache.#
Zudem darfst du das aktualisieren der HTML nicht vergessen.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.07.2014, 22:02:24 via App

Oke alles klar!

Und wie würdest du die HTML-Seite am besten aufbauen? nur eine Table oder mehrere? und CSS kann man auch einwandfrei einsetzen oder?

LG Jakob

LG Jakob

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

21.07.2014, 06:50:48 via App

Würde auch mehrere tebles vlt auch geschachtelt verwenden.
Hast du vlt eine Vorlage eines Srundenplans erstellt mit untis?
Dann könntest du abschauen

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 12:17:12 via App

Nein wie meinst du das genau?

LG Jakob

LG Jakob

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

21.07.2014, 15:45:48 via Website

Hier mal eine Vorlage:
http://hhg-ostfildern.de/Stundenplaene/index.html

jeder dieser Stundenpläne ist mit Untis erstellt, vlt. schreibst du einfacheren HTML Code aber sowas könntest du als Vorlage nehmen

— geändert am 21.07.2014, 15:45:58

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 16:23:57 via App

Oke danke!

Glaubst du das die App auch nur eine HTML-Seite ist? ich glaube fast, dass das trotzdem programmiert wurde und keine Webview ist. Aber egal mache eine Webview, ist für meine Zwecke eh besser ;)

LG Jakob

LG Jakob

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

21.07.2014, 17:07:11 via Website

Welche App meinst du?
Die DSB App?
Oder gibt es von Untis ne eigene?
Wahrscheinlich werden die auch nur die HTML anzeigen, ist in der App die ich habe nämlich so.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 17:11:45 via App

Es gibt eine Untis-App. Habe eh einen Screenshot bei meiner Frage gepostet.

LG Jakob

LG Jakob

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

21.07.2014, 17:13:49 via Website

Kannstes ja mal mit HTML probieren, sonst immer noch wegen dem Table Layout nachschauen

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

22.07.2014, 22:31:58 via App

Wie schaffe ich dass die HTML-Seite sich an das mobile Gerät "anpasst"?

LG Jakob

LG Jakob

Antworten
Tim Lenzmeier
  • Forum-Beiträge: 11

22.07.2014, 23:41:59 via App

Könnte sein das man das mit CSS realisiert?

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

23.07.2014, 06:27:17 via App

Dafür kannst du den Viewport Tag nehmen.
Google mal danach.

— geändert am 23.07.2014, 06:27:31

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 15:00:41 via Website

Mir ist nun gerade ein Problem mit der Webview und dem chachen aufgefallen. Ich prüfe in der onCreate-Methode ob eine Internetverbindung vorhanden ist. Falls diese vorhanden ist setze ich folgende Einstellungen der Webview:

String appCachePath = getApplicationContext().getCacheDir()
.getAbsolutePath();
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setAppCachePath(appCachePath);
webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

Wenn keine Verbindung vorhanden ist:

            webview.getSettings().setJavaScriptEnabled(false);
        webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);

Nun das Problem ist, dass wenn der Server down sein sollte, nicht aus dem Cache geladen wird. Wie kann ich das machen?

LG Jakob

LG Jakob

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

20.08.2014, 17:04:22 via App

Wenn die Verbindung erfolgreuch war die geladene Html in den Shared Prefs speichern. Das Problem ist nur dass du dafür den quelltext erst per httpclient holen musst und dann in der WebView anzeigen. Die webview besitzt nämlich keine Methode zum auskesen des quelltextes.
Oder du versuchst es nochmal mit dem Cache

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 17:27:21 via Website

Was mich überhaupt an der Sache stört, is dass das laden aus dem Cache und generell aus dem Web natürlich auch seine Zeit braucht ...

LG Jakob

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

20.08.2014, 17:29:42 via App

Aber da kannst du nichts gegen machen.
Das laden brauch nunmal Zeit fast alle Android User wissen das und stellen sich darauf ein.

— geändert am 20.08.2014, 17:29:58

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 17:31:40 via Website

Das nächste was mich extrem an der WebView stört, ist, dass in der Methode onReceiveError ein view.loadUrl(...) immer zu einer Endlosschelife führt in dem immer wieder die onReceiveError-Methode aufgerufen wird.

LG Jakob

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

20.08.2014, 17:34:44 via App

Dann musst du halt prüfen um welche Art von Error es sich handelt.
Ich lade z.b. bei der error methode nur eine error seite aus den assets an.
Aber über den errorcode etc solltest du das doch behandeln können

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 17:41:56 via Website

Das einzige was ich herausfinden muss, ist wann die Seite ohne einen Fehler aufgerufen wurde, damit ich dann die Seite cachen kann. Denn wenn ich die Seite cache wenn ein Fehler passiert wurde, dann kann sie dann nicht richtig geladen werden.

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 17:59:16 via Website

Oke danke!

Lustigerweise wird nicht immer derselbe ErrorCode aufgerufen wenn der Server nicht erreichbar ist. Bis jetzt ist einmal ERROR_CONNECT und einmal ERROR_HOST_LOOKUP geworfen worden.

LG Jakob

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

20.08.2014, 18:02:27 via App

Na also Passt doch kein Grund sich darüber Aufzuregen.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 18:03:57 via Website

Bin mir nur nicht sicher ob es nochwelche gibt die bei diesem Fall aufgerufen werden :P

Leider krieg ich noch immer eine Endlosschleife.

Findest du vielleicht einen Fehler?

@Override
        public void onReceivedError(final WebView view, int errorCode,
                String description, final String failingUrl) {
            view.setVisibility(WebView.INVISIBLE);
            Toast.makeText(getApplicationContext(), errorCode + "",
                    Toast.LENGTH_LONG).show();
            switch (errorCode) {
            case ERROR_CONNECT:
            case ERROR_HOST_LOOKUP:
                view.getSettings().setJavaScriptEnabled(false);
                view.getSettings()
                        .setCacheMode(WebSettings.LOAD_CACHE_ONLY);
                view.loadUrl(url_path + "/" + file);
                break;

            }
            view.setVisibility(WebView.VISIBLE);
        }

LG Jakob

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

20.08.2014, 18:13:16 via Website

Hier mal die Übersicht der Error Code:
http://developer.android.com/reference/android/webkit/WebViewClient.html

Da dein behandelter Error Code so eine Beschreibung hat:
Server or proxy hostname lookup failed
Android kann den DNS namen nicht auflösen.
Vlt solltest du Prüfen ob überhaupt eine Internetverbindung besteht.

Wie erzeugst du denn den Fehler?

— geändert am 20.08.2014, 18:13:32

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 18:47:12 via Website

Wie meinst du wie ich den Fehler erzeuge?

Hier mein neuer Code:

webview.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
            if (loadDialog != null) {
                loadDialog.cancel();
            }

            if (view.getSettings().getCacheMode() == WebSettings.LOAD_DEFAULT) {
                setCacheSettings();
            }
        }

        @Override
        public void onReceivedError(final WebView view, int errorCode,
                String description, final String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            Toast.makeText(getApplicationContext(), errorCode + "",
                    Toast.LENGTH_LONG).show();
            switch (errorCode) {
            //case ERROR_CONNECT:
            default:
                setLoadFromCacheSettings();
                view.loadUrl(url_path + "/" + file);
                break;

            }

        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            if (NetworkChangeReceiver.isMobileNetworkAvailable(ctx)
                    || NetworkChangeReceiver.isWifiNetworkAvailable(ctx)) {
            } else {
                setLoadFromCacheSettings();
            }
            view.loadUrl(url);
            return true;
            // return false; // load url in webview
        }
    });

private void setLoadFromCacheSettings() {
    webview.getSettings().setAppCacheEnabled(false);
    webview.getSettings().setJavaScriptEnabled(false);
    webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
}

private void setCacheSettings() {
    String appCachePath = getApplicationContext().getCacheDir()
            .getAbsolutePath();
    webview.getSettings().setAppCacheEnabled(true);
    webview.getSettings().setAppCachePath(appCachePath);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setAllowFileAccess(true);
    webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
}

LG Jakob

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

20.08.2014, 18:52:39 via Website

Wie erstellst du die verschiedenen Szenarien, sodass der Code überhaupt einen Fehler findet?
Schaltest du einfach das internet ab oder sorgst du dafür, dass die Anfrage ins Timeout läuft?

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.08.2014, 18:54:23 via Website

Internet abschalten ;) (vom Server)

— geändert am 20.08.2014, 18:54:50

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

22.08.2014, 22:59:54 via App

@Pascal: Du hast ja gesagt ich soll mir den Quellcode speichern. Jetzt meine Frage wenn ich das mit einem AsnycTask mache, lauft der dann weiter auch wenn der User die App schließt? Das ich zu unestimmten Zeiten zB den Quellcode neu runterladen und abspeichern kann.

LG Jakob

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

22.08.2014, 23:52:15 via App

Wenn die App geachlossen ist, muss der Task neu gestartet werden ausser ein Service übernimmt das.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

23.08.2014, 10:04:55 via App

Wie könnte dass ein Service übernehmen?

LG Jakob

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

23.08.2014, 10:32:40 via App

Da der Gcm eh nem Broadcast Reciver startet wenn eine message ankommt brauchst du nichmal nen Service.
Du musst nur deine Message do formatieren, dass er eine Methode ausführt.
Brauchst du das unbedingt, sozusagen remote ausführung von Methoden.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

23.08.2014, 12:19:15 via App

Naja ich wollte das jz gar nicht direkt mit GCM machen.

Ich habe mir dass so gedacht: Beim Start der Activity überprüfe ich ob schon Quellcode in den SharedPreferences gespeichert ist, falls nicht lade ich in die WebView die URL und lade den Quellcode herunter. Wenn Quellcode schon gespeichert wurde, wird dieser gleich geladen. Jetzt ist es so, dass man den Stundenplan auch in der App (andere JqueryMobile-Seite wird aufgerufen) bearbeiten kann und dann muss der Quellcode neu heruntergeladen werden. Und ich möchte den User nicht immer warten lassen, bis der Quellcode downgeladen wurden. Sondern dass das eben im Hintergrund passiert, wenn möglich auch wenn die App geschlossen wird.

LG Jakob

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

23.08.2014, 12:27:21 via App

Dann wäre ein Service durchaus von Vorteil.
Aber ist es so oft, dass sich die Seite ändert?
Sonst kannst du es mit gcm iglrgendwie koppeln.
Dafür brauchtest du nen Skript auf einem Server die die genannte seite alle 5 min oder so auf veränderung prüft.
Ist die Site verändert worden elwird automatisch ne gcm mit dem neudownload befehl gesendet.
So gehst du unötigem traffic und pollen aus dem weg.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

23.08.2014, 14:56:14 via App

Nein sie wird sich eher selten ändern.

Die Seite alle 5min zu überprüfen würde ich nicht machen, da es einfach zu selten vorkommt dass sich die Seite ändert.

Wie soll ich es deiner Meinung am besten lösen?

LG Jakob

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

23.08.2014, 15:42:52 via App

Hast du denn einen Webserver mit php?
Wenn ja könntest du die seite 1 mal oro tag oder so überprüfen lassen. Vom server aus.
Da ist es sogar esgal ob du das jetzt alle 5 min oder 1 mal am Tag machst.
Fakt ist wenn sich die Seite ändert machst du eine Gcm message auf alle client geräte.
Diese werten die message aus und merken dass sich die seite geändert hat.
Dann laden die den quelltext neu herunter und speichert ihn.
Falls du kein server hast ist die möglichkeit mit nem Service am effektifsten

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

23.08.2014, 16:01:47 via App

Ja ich habe einen eigenen Webserver.
Wie soll ich dass überprüfen? und kann ich da direkt im GcmIntentService den Download-AsyncTask starten?

LG Jakob

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

23.08.2014, 16:20:14 via App

Also ich habe mir für sowas nen php geschrieben,das wenn es aufgerufen wird die seite auf neuigkeiten überprüft indem das Skript den aktuellen quelltext mit dem gespeicherten vergleicht.
Sind die beiden nicht identisch->gcm mit aktualisieung.
Und neuen Quelltext in ner datei speichern.

Ich glaube das du das schon downloaden kannst probier es einfach mal.
Ich benutze kein Service sondern einen normalen Broadcast reciver.
Teste das einfach mal aus.

— geändert am 23.08.2014, 16:20:22

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

23.08.2014, 16:32:25 via App

Das heißt du hast am Server die PHP liegen und eine Textdatei mit den Quellcode und die werden dann verglichen?

Ist bei mir eh auch ein BroadcastReceiver ;)

LG Jakob

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

23.08.2014, 16:41:57 via App

Genau und wenn das php irgend eine Abweichung feststellt wir ne gcm gesendet

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

23.08.2014, 17:06:43 via App

Und wie kann ich das mit PHP genau überprüfen und so dass es in gewissen Abständen gesendet wird?

LG Jakob

Antworten