2011-11-08 57 views
2

我想自定義編輯字段,如在此鏈接http://www.hostingpics.net/viewer.php?id=44669634im.png。 我發現這個代碼自定義黑莓手機上的編輯字段

------------------------------------------------CustomTextBox--------------------- 
     package mypackage; 
     import net.rim.device.api.ui.Manager; 
     import net.rim.device.api.ui.Field; 
     import net.rim.device.api.ui.component.EditField; 
     import net.rim.device.api.ui.component.BasicEditField; 
     import net.rim.device.api.system.EncodedImage; 
     import net.rim.device.api.system.Bitmap; 
     import net.rim.device.api.system.Display; 
     import net.rim.device.api.ui.Graphics; 
     import net.rim.device.api.system.Characters; 
     import net.rim.device.api.math.Fixed32; 
     import net.rim.device.api.ui.DrawStyle; 
     import net.rim.device.api.ui.Font; 

     public class CustomTextBox extends Manager 
     { 
      /** 
      * Default margins 
      */ 
      private final static int DEFAULT_LEFT_MARGIN = 10; 
      private final static int DEFAULT_RIGHT_MARGIN = 10; 
      private final static int DEFAULT_TOP_MARGIN = 5; 
      private final static int DEFAULT_BOTTOM_MARGIN = 5; 

      /** 
      * Default paddings 
      */ 
      private final static int DEFAULT_LEFT_PADDING = 10; 
      private final static int DEFAULT_RIGHT_PADDING = 10; 
      private final static int DEFAULT_TOP_PADDING = 5; 
      private final static int DEFAULT_BOTTOM_PADDING = 5; 

      /** 
      * Margins around the text box 
      */ 
      private int topMargin = DEFAULT_TOP_MARGIN; 
      private int bottomMargin = DEFAULT_BOTTOM_MARGIN; 
      private int leftMargin = DEFAULT_LEFT_MARGIN; 
      private int rightMargin = DEFAULT_RIGHT_MARGIN; 

      /** 
      * Padding around the text box 
      */ 
      private int topPadding = DEFAULT_TOP_PADDING; 
      private int bottomPadding = DEFAULT_BOTTOM_PADDING; 
      private int leftPadding = DEFAULT_LEFT_PADDING; 
      private int rightPadding = DEFAULT_RIGHT_PADDING; 

      /** 
      * Amount of empty space horizontally around the text box 
      */ 
      private int totalHorizontalEmptySpace = leftMargin + leftPadding 
               + rightPadding + rightMargin; 

      /** 
      * Amount of empty space vertically around the text box 
      */ 
      private int totalVerticalEmptySpace = topMargin + topPadding 
              + bottomPadding + bottomMargin; 

      /** 
      * Minimum height of the text box required to display the text entered 
      */ 
      private int minHeight = getFont().getHeight() + totalVerticalEmptySpace; 

      /** 
      * Width of the text box 
      */ 
      private int width = Display.getWidth(); 

      /** 
      * Height of the text box 
     */ 
     private int height = minHeight; 

     /** 
     * Background image for the text box 
     */ 
     private EncodedImage backgroundImage; 

     /** 
     * Bitmap version of the backgroundImage. 
     * Needed to reduce the calculation overhead incurred by 
     * scaling of the given image 
     * and derivation of Bitmap from the 
     * EncodedImage every time it is needed. 
     */ 
     private Bitmap bitmapBackgroundImage; 

     /** 
     * The core element of this text box 
     */ 
     private EditField editField; 
     //private BasicEditField editField; 

     //private String entireText; 

     public CustomTextBox() 
     { 
      // Let the super class initialize the core 
      super(0); 

      // An edit field is the sole field of this manager. 
      editField = new EditField(); 
      //editField = new CustomEditField(); 
      add(editField); 
     } 

     public CustomTextBox(EncodedImage backgroundImage) 
     { 
      this();   
      setBackgroundImage(backgroundImage); 
     } 

     public void setSize(int width, int height) 
     { 
      boolean isChanged = false; 

      if (width > 0 // Ignore invalid width 
        && this.width != width) 
      { 
       this.width = width; 
       isChanged = true; 
      } 

      // Ignore the specified height if it is less 
      // than the minimum height required to display the text. 
      if (height > minHeight && height != this.height) 
      { 
       this.height = height; 
       isChanged = true; 
      } 

      // If width/height has been changed and background image 
      // is available, adapt it to the new dimension 
      if (isChanged == true && backgroundImage != null) 
      { 
       bitmapBackgroundImage = getScaledBitmapImage(backgroundImage, 
             this.width - (leftMargin+rightMargin), 
             this.height - (topMargin+bottomMargin)); 
      } 
     } 

     public void setWidth(int width) 
     { 

      if (width > 0 && width != this.width) 
      { 
       this.width = width; 

       // If background image is available, adapt it to the new width 
       if (backgroundImage != null) 
       { 
        bitmapBackgroundImage = getScaledBitmapImage(backgroundImage, 
              this.width - (leftMargin+rightMargin), 
              this.height - (topMargin+bottomMargin)); 
       } 
      } 
     } 

     public void setHeight(int height) 
     { 
      // Ignore the specified height if it is 
      // less than the minimum height required to display the text. 
      if (height > minHeight) 
      { 
       this.height = height; 

       // If background image is available, adapt it to the new width 
       if (backgroundImage != null) 
       { 
        bitmapBackgroundImage = getScaledBitmapImage(backgroundImage, 
              this.width - (leftMargin+rightMargin), 
              this.height - (topMargin+bottomMargin)); 
       } 
      } 
     } 

     public void setBackgroundImage(EncodedImage backgroundImage) 
     { 
      this.backgroundImage = backgroundImage; 

      // Consider the height of background image in 
      // calculating the height of the text box. 
      // setHeight() does not ensure that specified 
      // height will be in effect, of course, for valid reasons. 
      // So derivation of Bitmap image in the setHeight() method is not sure. 
      setHeight(backgroundImage.getHeight() + topMargin + bottomMargin); 
      if (bitmapBackgroundImage == null) 
      { 
       bitmapBackgroundImage = getScaledBitmapImage(backgroundImage, 
             this.width - (leftMargin+rightMargin), 
             this.height - (topMargin+bottomMargin)); 
      } 
     } 

     /** 
     * Generate and return a Bitmap Image scaled according 
     * to the specified width and height. 
     * 
     * @param image  EncodedImage object 
     * @param width  Intended width of the returned Bitmap object 
     * @param height Intended height of the returned Bitmap object 
     * @return Bitmap object 
     */ 
     private Bitmap getScaledBitmapImage(EncodedImage image, int width, int height) 
     { 
      // Handle null image 
      if (image == null) 
      { 
       return null; 
      } 

      int currentWidthFixed32 = Fixed32.toFP(image.getWidth()); 
      int currentHeightFixed32 = Fixed32.toFP(image.getHeight()); 

      int requiredWidthFixed32 = Fixed32.toFP(width); 
      int requiredHeightFixed32 = Fixed32.toFP(height); 

      int scaleXFixed32 = Fixed32.div(currentWidthFixed32, requiredWidthFixed32); 
      int scaleYFixed32 = Fixed32.div(currentHeightFixed32, requiredHeightFixed32); 

      image = image.scaleImage32(scaleXFixed32, scaleYFixed32); 

      return image.getBitmap(); 
     } 


     protected void sublayout(int width, int height) 
     { 
      // We have one and only child - the edit field. 
      // Place it at the appropriate place. 
      Field field = getField(0); 
      layoutChild(field, this.width - totalHorizontalEmptySpace, 
         this.height - totalVerticalEmptySpace); 
      setPositionChild(field, leftMargin+leftPadding, topMargin+topPadding); 

      setExtent(this.width, this.height); 
     } 

     public void setTopMargin(int topMargin) 
     { 
      this.topMargin = topMargin; 
     } 

     public void setBottomMargin(int bottomMargin) 
     { 
      this.bottomMargin = bottomMargin; 
     } 


     protected void paint(Graphics graphics) 
     { 
      // Draw background image if available, otherwise draw a rectangle 
      if (bitmapBackgroundImage == null) 
      { 
       graphics.drawRect(leftMargin, topMargin, 
            width - (leftMargin+rightMargin), height - (topMargin+bottomMargin)); 
       graphics.drawRoundRect(leftMargin, topMargin, 
             width - (leftMargin+rightMargin), 
             height - (topMargin+bottomMargin), 5, 5); 
      } 
      else 
      { 
       graphics.drawBitmap(leftMargin, topMargin, 
            width - (leftMargin+rightMargin), 
            height - (topMargin+bottomMargin), 
            bitmapBackgroundImage, 0, 0); 
      } 

      // Determine the rightward text that can fit into the visible edit field 

      EditField ef = (EditField)getField(0); 
      String entireText = ef.getText(); 

      boolean longText = false; 
      String textToDraw = ""; 
      Font font = getFont(); 
      int availableWidth = width - totalHorizontalEmptySpace; 
      if (font.getAdvance(entireText) <= availableWidth) 
      { 
       textToDraw = entireText; 
      } 
      else 
      { 
       int endIndex = entireText.length(); 
       for (int beginIndex = 1; beginIndex < endIndex; beginIndex++) 
       { 
        textToDraw = entireText.substring(beginIndex); 
        if (font.getAdvance(textToDraw) <= availableWidth) 
        { 
         longText = true; 
         break; 
        } 
       } 
      } 

      if (longText == true) 
      {   
       // Force the edit field display only the truncated text 
       ef.setText(textToDraw); 

       // Now let the components draw themselves 
       super.paint(graphics); 

       // Return the text field its original text 
       ef.setText(entireText); 
      } 
      else 
      { 
       super.paint(graphics); 
      } 
     } 

     public int getPreferredWidth() 
     { 
      return width; 
     } 

     public int getPreferredHeight() 
     { 
      return height; 
     } 

     protected boolean keyChar(char ch, int status, int time) 
     { 
      if (ch == Characters.ENTER) 
      { 
       return true; 
      } 
      else 
      { 
       return super.keyChar(ch, status, time); 
      } 
     } 

     public String getText() 
     { 
      return ((EditField)getField(0)).getText(); 
     } 

     public void setText(final String text) 
     { 
      ((EditField)getField(0)).setText(text); 
     }  
    } 

--------------------------------------------MyScreen------------------------ 

    package mypackage; 

    import net.rim.device.api.ui.component.LabelField; 
    import net.rim.device.api.ui.container.MainScreen; 

    /** 
    * A class extending the MainScreen class, which provides default standard 
    * behavior for BlackBerry GUI applications. 
    */ 
    public final class MyScreen extends MainScreen 
    { 
     public MyScreen() 
      { 
      new CustomTextBox(); 
       } 
    } 
--------------------------------------------MyApp------------------------ 


    package mypackage; 

    import net.rim.device.api.ui.UiApplication; 

    /** 
    * This class extends the UiApplication class, providing a 
    * graphical user interface. 
    */ 
    public class MyApp extends UiApplication 
    { 

     public static void main(String[] args) 
     { 
      // Create a new instance of the application and make the currently 
      // running thread the application's event dispatch thread. 
      MyApp theApp = new MyApp();  
      theApp.enterEventDispatcher(); 
     } 



     public MyApp() 
     {   
      // Push a screen onto the UI stack for rendering. 
      pushScreen(new MyScreen()); 
     }  
    } 

但我得到白屏我應該在此代碼更改爲ibtain的custon編輯字段

+0

你得到了什麼錯誤? –

+0

我沒有獲得錯誤我不知道如何使用這個類來顯示自定義編輯字段 – mobileDeveloper

+0

使用它作爲任何其他類來調用對象? –

回答

1

嗨,你只需要創建對象,但你忘了添加對象mainscreen

package mypackage; 

import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.container.MainScreen; 

/** 
* A class extending the MainScreen class, which provides default standard 
* behavior for BlackBerry GUI applications. 
*/ 
public final class MyScreen extends MainScreen 
{ 
    public MyScreen() 
     { 
     add(new CustomTextBox());//in your code it is like new CustomTextBox(); 
      } 
} 

,如果你想任何圖像作爲背景添加到您的編輯框,那麼你可以你要跟以下方式

包mypackage的;

import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.container.MainScreen; 

/** 
* A class extending the MainScreen class, which provides default standard 
* behavior for BlackBerry GUI applications. 
*/ 
public final class MyScreen extends MainScreen 
{ 
    public MyScreen() 
     { 
      EncodedImage enc_img=EncodedImage.getEncodedImageResource("input-box.png");//image name is 'input-box.png' 
    CustomTextBox edi_box=new CustomTextBox(enc_img); 
    add(edi_box); 
     } 
}