Die Programmierung von Sichtbehältern unter Android (Die Programmierung von Sichtbehältern unter Android), Lektion, Seite 723772
https://www.purl.org/stefan_ram/pub/aufteilungen_android (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Android-Entwicklung

Die Programmierung von Sichtbehältern unter Android 

Durch Implementieren von Methoden mit den Deskriptoren »void onMeasure(int,int)« und »void onLayout(int,int,int,int)« kann eine Sichtfläche ihre Größe sowie die Größe und Position ihrer Inhalte in einem gewissen Rahmen festlegen.

Zur Festlegung der Größenbedarfs einer Sichtfläche wird vom Behälter einer Sichtfläche (möglicherweise mehrfach) die Methode »onMeasure(int,int)« der Sichtfläche aufgerufen. Die Sichtfläche kann in ihrer Implementation jener Methode in einem gewissen Rahmen die von ihr für sich selbst und für ihre Inhalte gewünschte Größe festlegen.

Danach wird vom Behälter der Sichtfläche einmal die Methode »onLayout(int,int,int,int)« der Sichtfläche aufgerufen, in welchem die Sichtfläche ihre eigene Größe und Position  erfährt und die Größe und Position ihrer Inhalte durch Aufrufe der Signatur »layout(int,int,int,int)« festlegen kann.

Die Methode »onMeasure(int,int)«

Eine Implementation der Methode mit dem Deskriptor »void onMeasure(int,int)« erlaubt es einer Sichtfläche, die von ihr gewünschte Größe festzulegen. Diese Größe muß sich dabei in einem vorgegebenen Rahmen bewegen, welcher durch den Restriktionsmodus festgelegt wird.

Die Parameter stellen eine Spezifikation dar, welche jeweils einen Modus (»getMode«) und eine Ausdehnung (»getSize«) enthält. Ihre Position erfährt die Sichtfläche hier nicht.

Abfrage des Restriktionsmodus
final int widthMode  = android.view.View.MeasureSpec.getMode( widthSpec  );
final int heightMode = android.view.View.MeasureSpec.getMode( heightSpec );

Es gibt die folgenden Restriktionsmodi:

Restriktionsmodi
»android.view.View.MeasureSpec.UNSPECIFIED« keine Restriktion.
»android.view.View.MeasureSpec.AT_MOST« der angegebenen Wert (getSize) ist eine Obergrenze
»android.view.View.MeasureSpec.EXACTLY« keine Wahl mehr möglich, die Ausdehnung wurde bereits durch den Behälter dieser Sichtfläche festgelegt

Am Ende muß »this.setMeasuredDimension(int,int)« mit der gewünschten Positionierung aufgerufen werden.

Die Methode »void onLayout(int,int,int,int)«

In dieser Methode erfährt die Sichtfläche ihre eigene Größe und Position und legt die Position und Größe ihrer Inhalte auf der Grundlage ihrer eigenen Position und Größe fest.

Die Begrenzung der Höhe des Textfeldes

Es wurde beobachtet, daß die Zahlen im Textfelde manchmal nicht mehr sichtbar sind, wenn das Textfeld nicht breit genug ist.

Um diese Störung zu verhindern wird hier ein Behälter für zwei Inhalte gezeigt, der bei vertikaler Aufteilung dafür sorgt, daß der erste Inhalt mindestens doppelt so breit wie hoch ist  und ansonsten möglichst 50 % der gesamten Höhe des Behälters einnimmt.

Wir müssen dazu »onMeasure« und »onLayout« überschreiben. Im Betrieb wird zuerst »onMeasure« aufgerufen. Dadurch erfährt der Behälter von seinen eigenen Dimensionen und informiert seinerseits seine Inhalte. Hierzu wird »child.measure« verwendet. »limitedHeight« begrenzt dabei die Höhe des ersten Inhalts, was der eigentliche Sinn des »CalculatorLayout« ist. Da wird die übergebene Größe der Sichtfläche nicht  verändern, müssen wir die Restriktionsmodi nicht  berücksichtigen.

Durch »onLayout« wird dann die tatsächliche Festlegung der Größe der Inhalte vorgenommen.

Ein Behälter
class CalculatorLayout extends android.view.ViewGroup
{ CalculatorLayout( final android.content.Context context )
{ super( context ); }

int pos = 0;

@java.lang.Override
protected void onMeasure( final int widthSpec, final int heightSpec )
{ pos = 0;
final int width = android.view.View.MeasureSpec.getSize( widthSpec );
final int height = android.view.View.MeasureSpec.getSize( heightSpec );
for( int i = 0; i < getChildCount(); ++i )
{ final android.view.View child = getChildAt( i );
if( i == 0 )
{ final int defaultHeight = height/2;
final int limitedHeight = defaultHeight > width/2 ? width/2 : h0;
final int hSpec = android.view.View.MeasureSpec.makeMeasureSpec
( limitedHeight, android.view.View.MeasureSpec.EXACTLY );
child.measure( widthSpec, hSpec );
pos = limitedHeight; }
else
{ final int h = height - pos;
final int hSpec = android.view.View.MeasureSpec.makeMeasureSpec
( h, android.view.View.MeasureSpec.EXACTLY );
child.measure( widthSpec, hSpec ); }}
CalculatorLayout.this.setMeasuredDimension( widthSpec, heightSpec ); }

@java.lang.Override
protected void onLayout
( final boolean changed, final int left, final int top, final int right, final int bot )
{ int lineHeight = 0;
int myWidth = right - left;
for( int i = 0; i < getChildCount(); ++i )
{ final android.view.View child = getChildAt( i );
if( i == 0 )child.layout( left, top, right, pos );
else child.layout( left, top + pos, right, bot ); }}}

Übungsaufgaben

/   Übungsaufgabe

Bauen Sie die obige Klasse in das Programm ein, und ersetzen Sie das bisher für die vertikale Aufteilung verwendete »android.widget.LinearLayout« dann durch unser neues »CalculatorLayout«.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723772 stefan_ram:723772 Die Programmierung von Sichtbehältern unter Android Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723772, slrprddef723772, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/aufteilungen_android