layout_height = layout_width ?

  • Antworten:10
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 20

14.08.2017, 13:18:31 via Website

Ich will ein quadratisches FrameLayout genau passend in den oberen Teil eines Hochformat-Screens rein kriegen, bei z.B. 1200 Pixel Screenbreite etwa so:

xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="0dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:paddingTop="0dp">

android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="1200px"
android:layout_below="@+id/btnCal"
android:layout_centerHorizontal="true"
android:layout_marginTop="12px"
android:background="#d0d0d0" >

d.h. für FrameLayout1 muss android:layout_height = android:layout_width sein. So lässt sich das aber nicht angeben, d.h. es klappt so nur, wenn man die Screenbreite schon vorher kennt (hier: 1200px). Weiss jemand, wie man das für beliebige Screenbreiten machen kann, ohne sie explizit angeben zu müssen, möglichst auf xml-Ebene ohne Java-Code?

Antworten
  • Forum-Beiträge: 2.909

14.08.2017, 13:25:32 via Website

Hallo Klaus,

warum muss es denn in Pixel sein und nimmst nicht dp ??
Den Randabstand kannst du jeweils mit den Margins angeben

Und ja , wenn du es exakt quadratisch für jedes Device haben magst , musst du dir vorher die Screen-Dimensions
und auch die darauf basierende DPI ermitteln - kommst also nicht um den Source herum.

— geändert am 15.08.2017, 14:48:51

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 20

23.08.2017, 23:28:41 via Website

Ich versuche hierauf zu antworten, aber dieses System zerkloppt den Text (hat es bei dem vorigen Beitrag auch schon teilweise getan). Kennt einer ein Forum, in das man Beiträge zerstörungsfrei rein schreiben kann?

— geändert am 23.08.2017, 23:49:03

Antworten
  • Forum-Beiträge: 2.909

23.08.2017, 23:32:13 via Website

Hallo KLaus,

dein Ansatz ist schon mal gut , allerdings setzt du hier die Pixel feste.

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(800,400);
this.setLayoutParams(params);

Im nächsten Schritt musst du hingehen und die Pixel relativ zur DPI berechnen.
Dazu musst du vorher den Bildschrim ermitteln

Schau dir mal DisplayMetrics, WindowManager und Window an .

— geändert am 23.08.2017, 23:33:27

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 20

24.08.2017, 00:24:12 via Website

Hallo Stefan, wahrscheinlich war der Text zu lang. Ich hatte es schon so gemacht wie du gerade vorgeschlagen hast, aber es funktioniert nicht. Hier steht es genauer:
Test

Antworten
  • Forum-Beiträge: 2.909

24.08.2017, 06:07:01 via Website

Hallo Klaus,

ich vermute , dass es Dir ein wenig an Verständniss fehlt :

a) auch in deinem Link berechnest du deine Maße NICHT in Abhängigkeit der gegebenen Hardware.
Ich sehe da keine Ermittlung der Displaygrösse / Pixel / DPI

b) Schau dir das mal bitte an
https://www.android-hilfe.de/forum/android-app-entwicklung.9/wie-wird-relativelayout-layoutparams-richtig-angewendet.814889.html#post-10266845

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 20

24.08.2017, 12:15:12 via Website

Hallo Stefan,

ich bin auf Angabe in Pixeln angewiesen, weil in dem Frame-Layout noch eine Kameravorschau und eine darüber liegende Zeichnung ist, die beide in Pixeln erstellt/konfiguriert werden. Das Beispiel enthält nur die Teile, in denen der Fehler, Länge und Breite eines Frame-Layouts nicht auf Java-Ebene einstellen zu können, sichtbar wird. Die festen Zahlen des Java-Beispiels können natürlich auch durch Variablen ersetzt werden, und mit denen geht es dann auch nicht.

Also immer noch die Frage: wie kann man Breite und Höhe eines Frame-Layouts zur Laufzeit, also auf Java-Ebene, auf gewünschte Werte setzen (also nicht so was wie "fill_parent")?

Antworten
  • Forum-Beiträge: 2.909

24.08.2017, 12:49:47 via Website

Hallo Klaus,

ich bin auf Angabe in Pixeln angewiesen,

Es ist völlig Schnuppe , ob du Millimeter, DP,DIP oder Pixel nimmst.
Um Höhe = Breite exakt zu berechnen , musst du vorher die Werte des Devices ermitteln.

Also immer noch die Frage: wie kann man Breite und Höhe eines Frame-Layouts zur Laufzeit, also auf Java-Ebene, auf gewünschte Werte setzen (also nicht so was wie "fill_parent")?

Also es tut mir sehr leid , das habe ich alles oben ganz genau erklärt, mehr kann ich nicht tun.

a) Du ermittelst die Metrics des Gerätes
b) Du berechnest daraus deine Pixel
c) Du setzt die Maße, wie du oben schon getan hast.
d) Der Javacode überschreibt die werte aus der XML
(Steht aber schon in dem Threadlink zum AH Forum)

— geändert am 24.08.2017, 13:04:51

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 20

24.08.2017, 13:42:08 via Website

Hallo Stefan,

das Problem ist, dass in meinem Beispiel vom 24.08.2017 00:24:12 der Javacode die Werte aus der XML offenbar nicht überschreibt. Dabei "ist völlig Schnuppe , ob du Millimeter, DP,DIP oder Pixel nimmst", wie du ganz richtig schreibst. Ich habe das Testprogramm natürlich auf einem Gerät laufen lassen und dabei gesehen, dass immer die Werte aus der XML genommen wurden und nicht aus dem Javacode (kein Zufall, dass ich für den Test in der XML andere Werte genommen habe als im Javacode).

In deinem Beispiel vom 24.08.2017 06:07:01 wird die ganze Sache nicht mit einem Frame-Layout, sondern mit einem TextView gemacht, was so natürlich auch mit einem FrameLayout funktionieren müsste. Tut es aber nicht, jedenfalls nicht bei mir! Kann es sein, dass Frame-Layouts im Gegensatz zu TextViews bzgl. Höhenänderungen auf Java-Ebene bockig sind?

Antworten
  • Forum-Beiträge: 2.909

24.08.2017, 13:53:51 via Website

Hallo Klaus,

Grundsätzlich kannst du jedes View nehmen - deshalb würde sich für deinen Fall auch ein Relative anbieten.
TextView leitet sich genau so von einem View ab , wie ein FrameLayout

java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.FrameLayout

Entweder hast du nach dem obigen Code vergessen nochmal explizit höhe und breite zu setzen oder irgend ein anderes Element im Layout macht dir einen Strich durch die Rechnung.

Vielleicht stimmt dein Code auch in der Reihenfolge nicht.

Also warum muss es denn ein FrameLayout sein ?
Nimm dir einen Relative.Container und darin genestet noch ein Relative, oder Imageview.
Was immer du auch benötigst ...

Ich denke , du hast ein Ablauf Problem in deinem Code, denn das was ich Dir oben erklärt habe, setze
ich mehrmals täglich um.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 20

25.08.2017, 19:36:00 via Website

Hallo Stefan,

nachdem nach viel Rumprobiererei der Fehler einfach nicht raus kam, bin ich "back to the roots" gegangen, habe ein ganz normales FrameLayout genommen, dessen Größe im XML auf halbwegs plausible Werte gesetzt und im onCreate einfach

    Point size = new Point();
    getWindowManager().getDefaultDisplay().getSize(size);
    findViewById(R.id.frameLayout).getLayoutParams().width = size.x;
    findViewById(R.id.frameLayout).getLayoutParams().height = size.x;

gesetzt, und es funktioniert!

Danke für deine beharrlichen guten Ratschläge, ohne die ich möglicherweise aufgegeben oder alles viel komplizierter gemacht hätte.

Klaus

Antworten

Empfohlene Artikel