1

我正在使用 Rim 示例中给出的自定义 EditField。使用此编辑字段,我可以在一行中输入最多字符。但问题是当我从编辑文本中获取时,最左边的隐藏字符没有得到。

以下是我的 CustomEditField 类

  import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Characters;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.EditField;

public class CustomEditfield extends Manager
{

    private final static int DEFAULT_LEFT_MARGIN = 0;
    private final static int DEFAULT_RIGHT_MARGIN = 5;
    private final static int DEFAULT_TOP_MARGIN = 0;
    private final static int DEFAULT_BOTTOM_MARGIN = 0;

    private final static int DEFAULT_LEFT_PADDING = 5;
    private final static int DEFAULT_RIGHT_PADDING = 5;
    private final static int DEFAULT_TOP_PADDING = 0;
    private final static int DEFAULT_BOTTOM_PADDING = 0;

    private int topMargin = DEFAULT_TOP_MARGIN;
    private int bottomMargin = DEFAULT_BOTTOM_MARGIN;
    private int leftMargin = DEFAULT_LEFT_MARGIN;
    private int rightMargin = DEFAULT_RIGHT_MARGIN;

    private int topPadding = DEFAULT_TOP_PADDING;
    private int bottomPadding = DEFAULT_BOTTOM_PADDING;
    private int leftPadding = DEFAULT_LEFT_PADDING;
    private int rightPadding = DEFAULT_RIGHT_PADDING;

    private int totalHorizontalEmptySpace = leftMargin + leftPadding + rightPadding + rightMargin;
    private int totalVerticalEmptySpace = topMargin + topPadding + bottomPadding + bottomMargin;

    private int minHeight = getFont().getHeight() + totalVerticalEmptySpace;

    private int width ;
    private int height ;

    private EditField editField;
    private Bitmap _currentPicture; 

    public CustomEditfield(String label,String initialValue,int maxChars,long style,Bitmap image)
    {
        super(0);
        this._currentPicture=image;

        this.width=_currentPicture.getWidth();
        this.height=_currentPicture.getHeight()+20;
        editField = new EditField(label, initialValue, maxChars,style);
//        editField.setPadding(_currentPicture.getHeight()/7, 0, 0, _currentPicture.getWidth()/40);
        add(editField);
    }    


    protected void sublayout(int width, int height)
    {
        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)
    {
//        graphics.drawRoundRect(leftMargin, topMargin, width - (leftMargin+rightMargin), height - (topMargin+bottomMargin), 5, 5);
        graphics.drawBitmap(leftMargin, topMargin, width - (leftMargin+rightMargin), height - (topMargin+bottomMargin), _currentPicture, 5, 0);
        EditField ef = (EditField)getField(0);
        String entireText = ef.getText();

        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)
                {
                    break;
                }
            }
        }   

        ef.setText(textToDraw);

        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);
    }    
}

------ 在我的屏幕课上---

et_fname = new CustomEditfield("", "", 50, EditField.NO_NEWLINE
            | EditField.FOCUSABLE, txt_bg);

所以当我打电话

et_fname.getText().toString().trim()

它只会返回可见字符。那么我怎样才能得到所有输入的字符。

如果有人有想法,请帮助..帮助将不胜感激。

4

3 回答 3

2

看你的绘画方法。在那里您截断 EditField 以便它只包含适合的文本。那么你期望会发生什么?

您可能认为您可以保存全文,然后调用 super.paint() 并恢复全文,但这实际上会给您带来其他问题。EditField 上的 setText() 将告诉该字段它已被更新,因此它将尝试重新绘制自己。因此,您将截断,它将标记为需要绘制的 EditField,调用 super.paint,replace,它将再次标记所需的绘制,然后 EditField 的绘制将启动并尝试绘制他们自己,我怀疑在为 Manager 调用paint() 的过程中会变得递归和混乱。

这种只在 Manager 中绘制可见区域的方法是有缺陷的,并且永远不会起作用。

你似乎想要做的是一个左右滚动的单行 EditField,更正常的方法是让一个全宽的 Horizo​​ntalFieldManager 添加 EdtiField 并让 HFM 左右滚动 EditField。我没有寻找执行此操作的示例代码,但我怀疑如果您环顾四周,您会找到一些。所以试试那个选项,让我们知道你的进展情况。

于 2014-04-08T15:57:07.050 回答
2

根据彼得·斯特兰奇的建议,

我找到了单行编辑字段的新解决方案,它解决了我的实际问题。

以下是我的带有水平滚动的单行编辑字段的 CustomEditField 类。

 import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.container.HorizontalFieldManager;

public class CustomEditfield extends HorizontalFieldManager
{
    private int managerWidth;
    private int managerHeight;
    BasicEditField searchEdit;
    private Bitmap _currentPicture;
    private int width ;
    private int height ;
    private final static int DEFAULT_LEFT_MARGIN = 0;
    private final static int DEFAULT_RIGHT_MARGIN = 5;
    private final static int DEFAULT_TOP_MARGIN = 0;
    private final static int DEFAULT_BOTTOM_MARGIN = 0;

    private final static int DEFAULT_LEFT_PADDING = 5;
    private final static int DEFAULT_RIGHT_PADDING = 5;
    private final static int DEFAULT_TOP_PADDING = 0;
    private final static int DEFAULT_BOTTOM_PADDING = 0;

    private int topMargin = DEFAULT_TOP_MARGIN;
    private int bottomMargin = DEFAULT_BOTTOM_MARGIN;
    private int leftMargin = DEFAULT_LEFT_MARGIN;
    private int rightMargin = DEFAULT_RIGHT_MARGIN;

    private int topPadding = DEFAULT_TOP_PADDING;
    private int bottomPadding = DEFAULT_BOTTOM_PADDING;
    private int leftPadding = DEFAULT_LEFT_PADDING;
    private int rightPadding = DEFAULT_RIGHT_PADDING;

    private int totalHorizontalEmptySpace = leftMargin + leftPadding + rightPadding + rightMargin;
    private int totalVerticalEmptySpace = topMargin + topPadding + bottomPadding + bottomMargin;

    public CustomEditfield(String label,String initialValue,int maxChars,long style,Bitmap image)
    {
        super(Manager.NO_HORIZONTAL_SCROLL);
        this._currentPicture=image;
        this.width=_currentPicture.getWidth();
        this.height=_currentPicture.getHeight()+20;

        searchEdit = new BasicEditField(label, initialValue, maxChars,style){
            public int getPreferredHeight()
            {                 
                return _currentPicture.getHeight();
            }
            public int getPreferredWidth()
            {                    
                return _currentPicture.getWidth();
            }
//            public void paint(Graphics g)
//            {
//                getManager().invalidate();
//                super.paint(g);                    
//            }
        };
        searchEdit.setPadding(_currentPicture.getHeight()/7, 0, 0, 0);

        HorizontalFieldManager hfm = new HorizontalFieldManager(Manager.HORIZONTAL_SCROLL)
        {
            public void sublayout(int width, int height)
            {
                if (managerWidth == 0) {
                    managerWidth = searchEdit.getPreferredWidth();
                }
                if (managerHeight == 0) {
                    managerHeight = searchEdit.getPreferredHeight();
                }
                super.sublayout(managerWidth, managerHeight);
                setExtent(managerWidth,managerHeight);
            }
            public void paint(Graphics g) {
                super.paint(g);
            }
        };
//        searchEdit.setMaxSize(70);
        hfm.add(searchEdit);
        add(hfm);
    }

    public int getPreferredHeight()
    {
        return _currentPicture.getHeight();
    }

    public String getText()
    {
        return searchEdit.getText();
    }

    public void setText(final String text)
    {
        searchEdit.setText(text);
    } 

    protected void sublayout(int maxWidth, int maxHeight)
    {
        Field currField;

        currField = this.getField(0);
        this.setPositionChild(currField,leftMargin+leftPadding, topMargin+topPadding);
        this.layoutChild(currField, this.width - totalHorizontalEmptySpace, this.height - totalVerticalEmptySpace);
        setExtent(this.width, this.height);
    }

    protected void paint(Graphics graphics)
    {
        graphics.drawBitmap(0, 0, getWidth(), getHeight(), _currentPicture, 0, 0);
//      graphics.drawBitmap(leftMargin, topMargin, width - (leftMargin+rightMargin), height - (topMargin+bottomMargin), _currentPicture, 5, 0);
        super.paint(graphics);
//        graphics.drawRect(0, 0, this.getPreferredWidth(), this.getPreferredHeight());
    }
}

我从Blackberry - Custom EditField Cursor找到了这个解决方案

我给这个是为了帮助别人。

于 2014-04-14T06:39:25.643 回答
0

问题是当您键入字符时,一旦字段宽度被字符占用。它将采用新字符并在字段中删除旧字符。因此,当您在字段内获取数据时,您只会获得字段上可用的字符。

您可以通过以下步骤重现此内容: 1. 输入至少 8 个字符。2. 按下返回键。3.然后来到第一个字符,它不是您输入的那个字符。

于 2014-04-09T19:55:51.800 回答