Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Fragen zu FMX unter Android (https://www.delphipraxis.net/180598-fragen-zu-fmx-unter-android.html)

greenmile 2. Jun 2014 11:38

Fragen zu FMX unter Android
 
Hallo,

ich habe mich inzwischen einigermaßen voran gearbeitet, meine App läuft soweit unter Android. Ich habe jedoch einige Punkte, die ich einfach nicht lösen kann, Google half leider auch nicht weiter:

- Gerät sperren/entsperren
Wenn meine App läuft und ich das Gerät sperre/entsperre, dann ist meistens die Anwendung nur noch ein einziger Klumpen, man sieht also keinen Text, keine Buttons, nix mehr. Ich habe schon mit "AddAppEventHandler" / "AppEventHandler" das Event "BecameActive" sowie "WillBecomeForeground" abgefangen und dort ein "Form.Invalidate" sowie "Application.Processmessages" gemacht, hilft leider nicht.

- Buttons / Themes
Ich verwende ein Std. Android-Theme für FMX, außerdem auf der Form Buttons mit dem Stylelookup "nexttoolbutton". Blödeweise kann man das Symbol teilweise sehr schlecht lesen. Kann man das im Designer ändern (also die Konturen heller machen) oder muss ich extra den Style anpassen?

- App beenden
Ich weiß, dass eine App eigentlich nicht beendet werden sollte, ich tue es trotzdem :) Dafür verwende ich "SharedActivity.finish;". Das funktioniert in den meisten Fällen, manchmal kann ich die App jedoch anschließend nicht mehr starten, es kommt dann nur noch ein grauer Klumpen (wie bei Punkt 1). Laut Task-Manager ist das Programm aber vorher korrekt geschlossen.

Insgesamt verläuft die Entwicklung erstaunlich gut und einfach, ich habe es allerdings erst auf meinem S4 getestet. Mal schauen, was auf einem Note passiert :)
Bis zu diesem Zeitpunkt muss ich Embarcadero jedoch einfach mal loben!

jaenicke 2. Jun 2014 12:05

AW: Fragen zu FMX unter Android
 
Zitat:

Zitat von greenmile (Beitrag 1261012)
- Gerät sperren/entsperren
Wenn meine App läuft und ich das Gerät sperre/entsperre, dann ist meistens die Anwendung nur noch ein einziger Klumpen, man sieht also keinen Text, keine Buttons, nix mehr.

Das passiert bei mir nicht. Hast du vielleicht eine kleine Beispiel-App?

greenmile 2. Jun 2014 12:06

AW: Fragen zu FMX unter Android
 
Da reicht eine normale Hello-World App auf einem Galaxy S4.

Darlo 2. Jun 2014 12:22

AW: Fragen zu FMX unter Android
 
Zitat:

Zitat von greenmile (Beitrag 1261012)
- Gerät sperren/entsperren
Wenn meine App läuft und ich das Gerät sperre/entsperre, dann ist meistens die Anwendung nur noch ein einziger Klumpen, man sieht also keinen Text, keine Buttons, nix mehr. Ich habe schon mit "AddAppEventHandler" / "AppEventHandler" das Event "BecameActive" sowie "WillBecomeForeground" abgefangen und dort ein "Form.Invalidate" sowie "Application.Processmessages" gemacht, hilft leider nicht.

Hatte so ein ähnliches Problem auch mal und habe es mit

Delphi-Quellcode:
  frmMain.Width := Screen.Size.Width;
  frmMain.Height := Screen.Size.Height;
hinbekommen.

Gruß

greenmile 2. Jun 2014 12:26

AW: Fragen zu FMX unter Android
 
Im Event "BecameActive" hast Du frmMain.Width := Screen.Size.Width; / frmMain.Height := Screen.Size.Height; definiert?

Hat leider nichts gebracht. Am einfachsten lässt es sich reproduzieren, in dem man die App in Delphi auf dem Android startet, während dieses Gesperrt ist. Entsperrt man das Handy, nachdem Delphi die App übertragen hat, sieht man nix mehr. Zumindest in den meisten Fällen. Ich verwende nur Komponenten, die ab Werk mit dabei sind, also PageControl, Labels, Buttons, Images.

greenmile 2. Jun 2014 18:29

AW: Fragen zu FMX unter Android
 
Den Punkt "Gerät sperren/entsperren" kann ich von der Liste streichen, war ein Design-Fehler: Ich habe bei Android immer eine Form mit Kopf-/Fußzeilen genommen. Die untere Toolbar hat dann jedoch immer die Anchors "Left, Top, Right, Bottom". Wenn das Gerät nun gesperrt und entsperrt wird, scheint sich die Größe der Form zu ändern. Die untere Toolbar passt sich an, ändert sich jedoch anscheinend nicht mehr zurück und ist plötzlich bildschirmfüllend. Einfach den Anchor "Top" als false gesetzt und schon klappt es.

Bei den restlichen Punkten bin ich leider noch nicht weiter.

Rene2 3. Jun 2014 09:47

AW: Fragen zu FMX unter Android
 
So ein Problem mit sperren/entsperren habe ich auch siehe hier. Das konnte ich noch nicht lösen, werde aber mal Deine Strategie ausprobieren.

greenmile 3. Jun 2014 10:06

AW: Fragen zu FMX unter Android
 
Es gibt doch Unterschiede zwischen XE5 und XE6. In XE6 hat sich wirklich was getan, so hätte es von Anfang an sein müssen.
Es macht schon Spaß zu sehen, wie die Anwendung mit wenig Aufwand mal eben auf einer anderen Plattform läuft; wenn auch teilweise recht langsam.

Ich raffe FMX aber noch nicht so richtig. Ich habe eine Anwendung für das Galaxy S4 designed, verwende nur original Labels, Checkboxen usw. mit original Eigenschaften (Style). Ich bin jetzt davon ausgegangen, dass, wenn ich die App auf einem Galaxy Tab laufen lasse, alles gleich aussieht. Während aber auf dem S4 z.B. die hälfte des Bildschirms mit Texten gefüllt wird, braucht derselbe Text auf dem Galaxy Tab nur 1/3, es wird also nicht hochskaliert. Irgendwas übersehe ich. Oder verstehe ich falsch.

Darlo 4. Jun 2014 10:38

AW: Fragen zu FMX unter Android
 
Ich glaube nicht, dass eine automatische Skalierung funktioniert, bzw. dass es diese gibt. Wir machen immer zwei Designs, eins für Phone und eins für Tablet.
Meist sieht ein Phone-Design, primär im Hochformat, auf einem Tablet, das gerne im Querformat genutzt wird, schrecklich aus.

greenmile 4. Jun 2014 10:42

AW: Fragen zu FMX unter Android
 
Machst Du dafür jedesmal ein neues Projekt? Oder wie habt ihr die verschiedenen Screens voneinander getrennt?

Darlo 4. Jun 2014 10:45

AW: Fragen zu FMX unter Android
 
Alles im einem Projekt. Das Mainformular ist leer. Dann wird beim starten der App geprüft ob Hoch- oder Querformat und ob es eher ein Tablet oder ein Phone ist.
Je nach Ergebnis wird dann der Inhalt von dem entsprechendem Design-Formular geladen.

RWarnecke 5. Jun 2014 17:08

AW: Fragen zu FMX unter Android
 
Ich frage in der DPR Datei ab, ob es sich um ein Tablet oder ein Smartphone handelt und lade dann das entsprechende Formular :
Delphi-Quellcode:
function IsPad: Boolean;
begin
{$IFDEF IOS}
  Result := TUIDevice.Wrap(TUIDevice.OCClass.currentDevice).userInterfaceIdiom = UIUserInterfaceIdiomPad;
{$ENDIF}
{$IFDEF ANDROID}
  Result := (MainActivity.getResources.getConfiguration.screenLayout and TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_MASK)
    >= TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_LARGE;
{$ENDIF}
Die Funktion gibt Dir für iOS und Android zurück, ob es sich um ein Tablet oder ein Smartphone handelt.

greenmile 6. Jun 2014 12:48

AW: Fragen zu FMX unter Android
 
Also zwei Forms für eine Anwendung. Und wie handelt ihr den Source (was sich hinter "Button1 verbirgt") sowie die verschiedenen Auflösungen eines Pads? TScaledLayout?
TScaledLayout funktioniert zwar, es sieht aber ziemlich gestrecht aus, also irgendwie ... komisch.

Darlo 6. Jun 2014 13:03

AW: Fragen zu FMX unter Android
 
Zitat:

Zitat von greenmile (Beitrag 1261602)
Und wie handelt ihr den Source (was sich hinter "Button1 verbirgt")

Über eine ActionList.

greenmile 6. Jun 2014 13:13

AW: Fragen zu FMX unter Android
 
Ach ja ... Muss mich erst dran gewöhnen, dass es die ja jetzt unter FMX gibt.
Und TScaledLayout?

Darlo 6. Jun 2014 13:26

AW: Fragen zu FMX unter Android
 
Das habe ich aufgegeben. Wir versuchen die Apps so zu designen, dass Sie auf möglichst vielen Formaten/Auflösungen brauchbar angezeigt werden. Optimiert wird es grundsätzlich für 1024x748 bzw. 1004x768.

greenmile 6. Jun 2014 13:50

AW: Fragen zu FMX unter Android
 
Ok, vielen dank für die Infos, das hilft mir weiter.

RWarnecke 6. Jun 2014 15:07

AW: Fragen zu FMX unter Android
 
Ich arbeite viel mit Anchors und Align um eine entsprechende Ansicht für die einzelnen Formate hinzubekommen.

greenmile 11. Jun 2014 15:18

AW: Fragen zu FMX unter Android
 
Zitat:

Zitat von RWarnecke (Beitrag 1261511)
Ich frage in der DPR Datei ab, ob es sich um ein Tablet oder ein Smartphone handelt und lade dann das entsprechende Formular :
Delphi-Quellcode:
function IsPad: Boolean;
begin
{$IFDEF IOS}
  Result := TUIDevice.Wrap(TUIDevice.OCClass.currentDevice).userInterfaceIdiom = UIUserInterfaceIdiomPad;
{$ENDIF}
{$IFDEF ANDROID}
  Result := (MainActivity.getResources.getConfiguration.screenLayout and TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_MASK)
    >= TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_LARGE;
{$ENDIF}
Die Funktion gibt Dir für iOS und Android zurück, ob es sich um ein Tablet oder ein Smartphone handelt.

Ist vielleicht eine blöde Frage, aber wie hast Du das realisiert? Wenn ich eine zweite Form mit .Show anzeige, dann klappt das nicht 100%. Oder handelst Du das direkt in der DPR?

MEissing 11. Jun 2014 15:40

AW: Fragen zu FMX unter Android
 
Siehe PhotoEditorDemo
http://docwiki.embarcadero.com/CodeE...ample_(Delphi)

RWarnecke 11. Jun 2014 18:40

AW: Fragen zu FMX unter Android
 
Zitat:

Zitat von greenmile (Beitrag 1261953)
Ist vielleicht eine blöde Frage, aber wie hast Du das realisiert? Wenn ich eine zweite Form mit .Show anzeige, dann klappt das nicht 100%. Oder handelst Du das direkt in der DPR?

Ich handel das direkt in der DPR ab, so zum Beispiel :
Delphi-Quellcode:
{$R *.res}

////////////////////////////////////////////////////////////////////////////////
///
///  To check if the app is running on a Pad
///
function IsPad: Boolean;
begin
{$IFDEF IOS}
  Result := TUIDevice.Wrap(TUIDevice.OCClass.currentDevice).userInterfaceIdiom = UIUserInterfaceIdiomPad;
{$ENDIF}
{$IFDEF ANDROID}
  Result := (MainActivity.getResources.getConfiguration.screenLayout and TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_MASK)
    >= TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_LARGE;
{$ENDIF}
end;
////////////////////////////////////////////////////////////////////////////////
///
///  Main Program
///
begin
  Application.Initialize;
  Application.FormFactor.Orientations := [TFormOrientation.Portrait, TFormOrientation.InvertedPortrait,
                                          TFormOrientation.Landscape, TFormOrientation.InvertedLandscape];
  if IsPad then
    Application.CreateForm(TPadMainForm, PadMainForm)
  else
    Application.CreateForm(TPhoneMainForm, PhoneMainForm);
  Application.Run;
end.

greenmile 12. Jun 2014 09:11

AW: Fragen zu FMX unter Android
 
Die Form-Vererbung... Man, da hätte ich auch selbst drauf kommen können. :oops:
Vielen Dank, klappt super!

greenmile 12. Jun 2014 10:58

AW: Fragen zu FMX unter Android
 
Kleine Frage: Ich habe in der Quell-Form ein TScaledLayout, dessen Column[0] ich in einer abgeleiteten Form vergrößern möchte. Beim Start bekomme ich jedoch dann den Fehler

Code:
Exception EReadError in Modul xxx.exe bei 000C1EE0.
Fehler beim Lesen von gridPanel.ColumnCollection: Eine Spalte, die Steuerelemente enthält, kann nicht gelöscht werden.
Ich habe jedoch nur die Größe im Designer geändert und die Original-Form läuft ...

RWarnecke 12. Jun 2014 11:49

AW: Fragen zu FMX unter Android
 
Warum dieses TScaledLayout ? Versuche mal die Komponenten nur mit Align und Anchors entsprechend zu Positionieren und Auszurichten. Habe damit bis jetzt keine Probleme gehabt.

greenmile 12. Jun 2014 12:19

AW: Fragen zu FMX unter Android
 
Ich verwend Checkboxen und wenn sich die Auflösung massiv ändert, dann ändert sich die Größe von den Teilen nicht. Außer halt bei TScaled.

RWarnecke 12. Jun 2014 12:29

AW: Fragen zu FMX unter Android
 
Sei mir net bös, aber warum Checkboxen. Ich habe bis jetzt noch keine Checkboxen in einer App gesehen. Dafür würde ich eher TSwitch nutzen.

greenmile 12. Jun 2014 13:02

AW: Fragen zu FMX unter Android
 
Steht so im Pflichtenheft :(

greenmile 19. Aug 2014 07:30

AW: Fragen zu FMX unter Android
 
Hat jemand eine Idee, wie ich zwischen den verschiedenen Größen unterscheide? Android Tablets gibt es ja von ... bis.

Ich kann ja im Designer verschiedene Tablets auswählen ("Google Nexus") usw. und alles darauf anpassen. Aber wie entscheide ich beim Start, welche der angepassten Forms geladen werden? Aktuell kann ich nach den Sourcen meiner Vorgänger nur zwischen Handy und Tablet unterscheiden.

greenmile 20. Aug 2014 08:51

AW: Fragen zu FMX unter Android
 
Frage selbst beantwortet, funktioniert in fast allen Fällen.

Code:

uses
  ...
  FMX.Platform.Android, Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android,
  ...

function IsTabletNormal: Boolean; // z.B. Handy
begin
  Result := (MainActivity.getResources.getConfiguration.screenLayout and TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_MASK)
    >= TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_NORMAL;
end;

function IsTabletLarge: Boolean; // z.B. 7" Nexus
begin
  Result := (MainActivity.getResources.getConfiguration.screenLayout and TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_MASK)
    >= TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_LARGE;
end;

function IsTabletXLarge: Boolean; // z.B. 10" Nexus
begin
  Result := (MainActivity.getResources.getConfiguration.screenLayout and TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_MASK)
    >= TJConfiguration.JavaClass.SCREENLAYOUT_SIZE_XLARGE;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz