Anpassung der Eingabemasken zur Laufzeit

  • 6 Antworten
  • Letztes Antwortdatum
D

de_Calle

Neues Mitglied
0
Hallo zusammen!

Ich arbeite gerade an einem Projekt zum Thema "Customizing von Multi-Client-Standard-Software". Konkret geht es um ein CRM-System, das neben einer normalen Windows-Version auch auf mobilen Endgeräten mit Android und iOS verfügbar ist. Die Unternehmen, die das CRM-System verwenden, sollen die Möglichkeit haben, ihre Eingabemasken anzupassen.
Als Beispiel: Die Eingabemaske für Adressen enthält in der Standard-Version nur die Felder "Name" und "Vorname". Ein Unternehmen möchte aber auch das Feld "E-Mail" auf der Eingabemaske haben.
Hierzu sollte es beispielsweise einen grafischen Editor geben, in dem das Feld eingefügt werden kann und der als Ergebnis eine Konfigurationsdatei ausgibt, die alle Layoutinformationen enthält. (Ggf. auch mehrere Konfigurationsdateien, die die Definitionen für die verschiedenen Plattformen enthalten. )
Bisher habe ich mich nur mit Android beschäftigt, wofür meine ursprüngliche Idee war, eine externe XML-Layout-Datei einzubinden. Leider habe ich dann erfahren, dass das nicht möglich ist...
In einem anderen Forum wurde mir geraten, das Layout dynamisch im Code (also nicht XML) zu erzeugen. Seine Idee war, eine Textdatei auf einem Server zu erstellen, in der zeilenweise alle benötigten Felder aufgeführt sind und diese dann auszulesen. Hier sein Codebeispiel:


Code:
  [FONT=&quot]private View getDynamicLayout(ArrayList<String> lines) {[/FONT]
  [FONT=&quot]    LinearLayout ll = new LinearLayout(this);[/FONT]
  [FONT=&quot]    for (String line : lines) {[/FONT]
  [FONT=&quot]        EditText et = new EditText(this);[/FONT]
  [FONT=&quot]        // fill it with some text[/FONT]
  [FONT=&quot]        et.setText(line);[/FONT]
  [FONT=&quot]        ll.addView(ll);[/FONT]
  [FONT=&quot]    }[/FONT]
  [FONT=&quot]    return ll;[/FONT]
  [FONT=&quot]}[/FONT]
  
  [FONT=&quot]protected void onCreate(Bundle savedInstanceState) {[/FONT]
  [FONT=&quot]    super.onCreate(savedInstanceState);[/FONT]
  [FONT=&quot]    ArrayList<String> layoutConfig = readConfigFromFile();[/FONT]
  [FONT=&quot]    View layout = getDynamicLayout(layoutConfig);[/FONT]
  [FONT=&quot]    setContentView(layout);[/FONT]
  [FONT=&quot]}[/FONT]

Kann mir hier jemand bestätigen, dass das so funktioniert? :) Ich bekomme es leider nicht so recht hin, bin allerdings auch kein Entwickler und soll auch gar nicht großartig auf Code eingehen.. eine abstrakte Beschreibung des Konzepts ist für meine Arbeit ausreichend.
Wenn das so funktioniert wäre die nächste Frage, ob zusätzlich noch weitere Feldinformationen in diese Datei gespeichert und ausgelesen werden können. Beispielsweise der Datentyp "money", wodurch zur Eingabe direkt das Zahlenfeld angeboten wird und die Eingabe auch entsprechend formatiert (Tausender-Trennzeichen, €-Zeichen..).
Ich hoffe, ich konnte das Problem verständlich beschreiben und bin dankbar für jede Hilfe, natürlich auch ganz andere Vorschläge.

Viele Grüße
Calle
 
Prinzipiell wird das schon gehen. Du kannst programmatisch jede View genauso zusammenbastelen als wäre sie in einem XML formuliert, nur etwas verboser.
Der Komplexität sind natürlich keine Grenzen gesetzt. Aber zusätzlich zu Frage der Eingabe stellt sich dann natürlich noch die Weiterverarbeitung. Wo werden die Daten der Felder gespeichert? Wie werden sie nützlich weiter verwendet?
Alles in allem bis zu einem gewissen Grad machbar (man muss vorher definieren was möglich ist, also einfach zu sagen "da kommt jetzt ein nur-zahlen Feld hin" ohne dass sich jemand vorher im Code dazu Gedanken gemacht hat funktioniert nicht) aber nicht ganz einfach.
 
Die Daten sollen in einer Datenbank gespeichert werden und auch von dort ausgelesen werden können.

Die Unternehmen haben auch hier die Möglichkeit selbst Anpassungen vorzunehmen (diese Schnittstelle existiert bereits). D.h. sie können neue Datensatz-Typen (also neben Adressen z.B. auch "Termine" oder "Aufgaben") erstellen. Und innerhalb dieser Datensatz-Typen noch eigene Felder.

Diese Datenbank liegt auf einem Applikationsserver und wird immer nur von einem einzigen Unternehmen verwendet.

Deshalb sieht mein Konzept bisher ungefähr so aus:


  1. Der Kunde legt alle gewünschten Datensatz-Typen und Felder in der Datenbank an (bereits hier gibt er den Datentyp an: int, varchar, money, etc.)
  2. Die angelegten Datensatz-Typen und Felder können nun in einem grafischen Editor auf der Eingabemaske platziert werden
  3. Der grafische Editor speichert diese Definitionen in einer Konfigurationsdatei auf dem Server und gibt jeder Eingabemaske eine eindeutige ID.
  4. Die Konfigurationsdatei enthält alle Infos zur Anordnung der Felder, deren Datentypen und die Layout-Informationen (z.B. ein- oder zweispaltig). Bestenfalls sind auch verschiedene Feldtypen möglich, also Datumsfelder, wo dann ein Kalender erscheint oder auch Dropdown-Listen usw.
  5. Meldet sich der Kunde jetzt in der App an, wird diese Konfigurationsdatei ausgelesen und alle Eingabemasken werden im Hintergrund vorgeladen. Dabei wird die ID der bereits vorgeladenen Eingabemasken mit der ID der Eingabemaske in der Konfigurationsdatei auf dem Server verglichen. Unterscheiden sie sich, werden die Definitionen neu geladen.
  6. Die Eingaben sollen gespeichert, angezeigt, geändert und gelöscht werden können.


Wenn das so machbar wäre, wärs super :D
 
Das klingt soweit machbar. Eventuell braucht man auf dem Gerät noch eine Datenbank die man dann live anpassen muss, aber das geht schon.

Also von meiner Seite gibts ein go von der Machbarkeit her. Der Aufwand sollte allerdings nicht unterschätzt werden.
 
Vielen Dank für deine Hilfe! Wenn mir jemand sagt wie das mit dem "Danke abgeben" funktioniert, kriegst du eins ;)
 
Der danke Knopf ist bei jedem Beitrag rechts unten in etwa :thumbsup:..........................................................................................hier drunter
 
Geht erst ab 10 Beiträge, aber passt schon ;)
 

Ähnliche Themen

G
Antworten
13
Aufrufe
756
Gerdchen07
G
Zurück
Oben Unten