BlackBerry HorizontalFieldManager with two Buttons on Opposite Sides
I have a HorizontalFieldManager with two buttons inside it. The buttons need to be placed on the far left and the far right of the screen, respectively. I know HorizontalFieldManager only puts them left-to-right, so i have to extend them.
Here is what I did, however it yields no fruit. The buttons do appear, but too small and with no text on them (Which I already set).
Here is my layout code.
protected void sublayout(int width, int height) {
setPositionChild(getField(0), 0, 0);
int fieldZeroWidth = Max(getField(0).getContentWidth(),getField(0).getPreferredWidth());
int fieldZeroHeight = Max(getField(0).getContentHeight(),getField(0).getPreferredHeight());
layoutChild(getField(0),
fieldZeroWidth,
fieldZeroHeight);
int fieldOneWidth = Max(getField(1).getContentWidth(),getField(1).getPreferredWidth());
setPositionChild(getField(1),
Display.getWidth() - fieldOneWidth,
0);
int fieldOneHeight = Max(getField(1).getPreferredHeight(),getField(1).getContentHeight());
layoutChild(getField(1),
fieldOneWidth,
fieldOneHeight
);
setExtent(Display.getWidth(), Max(getPref开发者_开发问答erredHeight(),fieldOneHeight,fieldZeroHeight));
}
After I create this custom manager, I add it at the bottom with setStatus() function.
I want the two buttons to appear on the opposite sides (which they do), however in the right size with their text displayed.
Thanks The Max functions just return the biggest between the arguments, obviously.
If u want to place the two field in the corners of the HorizontalFieldManager use this following code:
import net.rim.device.api.ui.*;
/**
* Custom class to place the Fields on two corners of the screen Horizontally
*/
public class JustifiedHorizontalFieldManager extends Manager
{
private static final int SYSTEM_STYLE_SHIFT = 32;
public Field _leftField;
public Field _rightField;
private boolean _giveLeftFieldPriority;
public JustifiedHorizontalFieldManager( Field leftField, Field rightField, boolean giveLeftFieldPriority )
{
this( leftField, rightField, giveLeftFieldPriority, Field.USE_ALL_WIDTH );
}
public JustifiedHorizontalFieldManager( Field leftField, Field rightField, boolean giveLeftFieldPriority, long style )
{
super( style );
_leftField = leftField;
_rightField = rightField;
add( _leftField );
add( _rightField );
_giveLeftFieldPriority = giveLeftFieldPriority;
}
public JustifiedHorizontalFieldManager( boolean giveLeftFieldPriority, long style )
{
super( style );
_giveLeftFieldPriority = giveLeftFieldPriority;
}
public void addLeftField( Field field )
{
if( _leftField != null ) {
throw new IllegalStateException();
}
_leftField = field;
add( _leftField );
}
public void addRightField( Field field )
{
if( _rightField != null ) {
throw new IllegalStateException();
}
_rightField = field;
add( _rightField );
}
public int getPreferredWidth()
{
return _leftField.getPreferredWidth() + _rightField.getPreferredWidth();
}
public int getPreferredHeight()
{
return Math.max( _leftField.getPreferredHeight(), _rightField.getPreferredHeight() );
}
protected void sublayout( int width, int height )
{
Field firstField;
Field secondField;
if( _giveLeftFieldPriority ) {
firstField = _leftField;
secondField = _rightField;
} else {
firstField = _rightField;
secondField = _leftField;
}
int maxHeight = 0;
int availableWidth = width;
availableWidth -= _leftField.getMarginLeft();
availableWidth -= Math.max( _leftField.getMarginRight(), _rightField.getMarginLeft() );
availableWidth -= _rightField.getMarginRight();
layoutChild( firstField, availableWidth, height - firstField.getMarginTop() - firstField.getMarginBottom() );
maxHeight = Math.max( maxHeight, firstField.getMarginTop() + firstField.getHeight() + firstField.getMarginBottom() );
availableWidth -= firstField.getWidth();
layoutChild( secondField, availableWidth, height - secondField.getMarginTop() - secondField.getMarginBottom() );
maxHeight = Math.max( maxHeight, secondField.getMarginTop() + secondField.getHeight() + secondField.getMarginBottom() );
availableWidth -= secondField.getWidth();
if( !isStyle( Field.USE_ALL_HEIGHT ) ) {
height = maxHeight;
}
if( !isStyle( Field.USE_ALL_WIDTH ) ) {
width -= availableWidth;
}
setPositionChild( _leftField, _leftField.getMarginLeft(), getFieldY( _leftField, height ) );
setPositionChild( _rightField, width - _rightField.getWidth() - _rightField.getMarginRight(), getFieldY( _rightField, height ) );
setExtent( width, height );
}
private int getFieldY( Field field, int height )
{
switch( (int)( ( field.getStyle() & FIELD_VALIGN_MASK ) >> SYSTEM_STYLE_SHIFT ) ) {
case (int)( FIELD_BOTTOM >> SYSTEM_STYLE_SHIFT ):
return height - field.getHeight() - field.getMarginBottom();
case (int)( FIELD_VCENTER >> SYSTEM_STYLE_SHIFT ):
return field.getMarginTop() + ( height - field.getMarginTop() - field.getHeight() - field.getMarginBottom() ) / 2;
default:
return field.getMarginTop();
}
}
public Field getLeftField()
{
return _leftField;
}
public Field getRightField()
{
return _rightField;
}
public void replace( Field oldField, Field newField )
{
if( oldField == newField ) {
// Nothing to do
return;
}
if( oldField == _leftField ) {
_leftField = newField;
} else if( oldField == _rightField ) {
_rightField = newField;
}
add( newField );
delete( oldField );
}
}
if you want set the text align then you have to set padding for buttonfield & if want to set align to buttonfield then you have set margin for buttonfield
精彩评论