2

btn1私は元々画面上に2つのボタン(と)があったブラックベリーのアプリケーションに取り組んでいbtn2ます。今、私は3分の1を追加しましたが、いくつかの問題が発生しています(btn3)。

元々は並んでいて、ボタンの外側をクリックすると、ボタンがアクティブになります...デザイン上の欠陥がありますが、見落とされる可能性がありますbtn1btn2

ただし、下にボタンを追加する必要があります。これbtn1を行うと、2つの奇妙なことが発生しました。1つは、[下]をクリックbtn3してもbtn1、フォーカスがに移動しbtn1btn1呼び出されることです。そして、クリックするとbtn2フォーカスがにシフトしbtn3、アクティブになります。

なぜこれが起こっているのか完全にはわかりませんが、以下に貼り付けたコードで遊んでいます。少しでも助けていただければ幸いです。

    btn1 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled_1a.png"), Bitmap.getBitmapResource("button-normal_2.png"));      
    btn2 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled_3.png"), Bitmap.getBitmapResource("button-normal_4.png"));
    btn3 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled5.png"), Bitmap.getBitmapResource("button-normal_6.png"));

    Background bg = BackgroundFactory.createBitmapBackground(Bitmap.getBitmapResource("background.png"));

    HorizontalFieldManager vfm = new HorizontalFieldManager(){
        public int getPreferredHeight() {
            // TODO Auto-generated method stub
            return Display.getHeight();
        }

        public int getPreferredWidth() {
            // TODO Auto-generated method stub
            return Display.getWidth();
        }

        protected void sublayout(int maxWidth, int maxHeight) {
            // TODO Auto-generated method stub
            int count = getFieldCount();
            for(int i = 0 ; i < count ; i++ ){
                Field f = getField(i);

             if(f == btn1 ){
                 setPositionChild(f, (getPreferredWidth() >> 1) - f.getPreferredWidth(), getPreferredHeight()>>1);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }else if (f == btn2 ){
                    setPositionChild(f, (getPreferredWidth() >> 1) +30, getPreferredHeight()>>1);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }else if (f == lblName ){
                    setPositionChild(f, 30, getPreferredHeight()>>1 - btnLicense.getPreferredHeight());
                    layoutChild(f, ( getPreferredWidth() * 3 ) >> 2, getPreferredHeight());
                }else if (f == btn3 ){

                    setPositionChild(f, (getPreferredWidth() >> 1) - f.getPreferredWidth() -0 ,  getPreferredHeight()- getPreferredHeight()+280);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }

            }
            setExtent(getPreferredWidth(),getPreferredHeight());
        }

        public void subpaint(Graphics graphics){
            int count = getFieldCount();
            for(int i = 0 ; i < count ; i++ ){
                net.rim.device.api.ui.Field f = getField(i);
                paintChild(graphics,f);
            }
        }

    };

カスタムボタンフィールド

package com.app.ui.component;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;

public class CustomButtonField extends Field {

    /** To set background image for button field */
    private Bitmap bkImage;

    /** To set Focus image for button field */
    private Bitmap bkFocusImage;

    /** int value for Field Width */
    private int fieldWidth;

    /** int value for Field Height */
    private int fieldHeight;

    /** Text to write on Button */
    private String text;

    /** Text Color on Button */
    private int textColor = Color.WHITE;

    /** Default Font for Button */
    private Font defaultFont = Font.getDefault();

    /**
     * Constructor with
     * @param text
     * @param image
     * @param focusImage
     */
    public CustomButtonField (String text, Bitmap image, Bitmap focusImage) {   
        this(text, image, focusImage, 0);
    }

    /**
     * Constructor with
     * @param text
     * @param image
     * @param focusImage
     * @param style
     */
    public CustomButtonField(String text, Bitmap image, Bitmap focusImage, long style) {
        super(Field.FOCUSABLE | style);
        this.text = text;
        bkImage = image;
        this.bkFocusImage = focusImage;
        fieldHeight = bkImage.getHeight();
        fieldWidth = bkImage.getWidth();
    }

    /**
     * To get the exact width needed by the field borderWidth - used to show the
     * width of focused rectangle around the button
     */
    public int getPreferredWidth() {
        return fieldWidth;
    }

    /**
     * To get the exact width needed by the field borderHeight - used to show
     * the height of focused rectangle around the button
     */
    public int getPreferredHeight() {
        return fieldHeight;
    }

    protected void layout(int width, int height) {
        setExtent(getPreferredWidth(), getPreferredHeight());
    }

    /**
     * To set the background according to focused state of the field
     */
    protected void drawFocus(Graphics graphics, boolean flag) {
        graphics.setFont(defaultFont);
        if (bkFocusImage != null) {
            graphics.drawBitmap((getPreferredWidth() - bkFocusImage.getWidth()) / 2,(getPreferredHeight() - bkFocusImage.getHeight()) / 2,
                    bkFocusImage.getWidth(), bkFocusImage.getHeight(),bkFocusImage, 0, 0);
        }
        graphics.setColor(Color.WHITE);
        int textWidth = defaultFont.getAdvance(text);
        graphics.drawText(text, (fieldWidth - textWidth) / 2,(fieldHeight - defaultFont.getHeight()) / 2);
    }

    protected void paint(Graphics graphics) {
        graphics.setFont(defaultFont);
        if (bkImage != null) {
            graphics.drawBitmap((getPreferredWidth() - bkImage.getWidth()) / 2,(getPreferredHeight() - bkImage.getHeight()) / 2,
                    bkImage.getWidth(), bkImage.getHeight(), bkImage, 0, 0);
        } 
        graphics.setColor(textColor);
        int color = (isEnabled())?Color.BLACK:Color.DARKGRAY;
        graphics.setColor(color);

        int textWidth = defaultFont.getAdvance(text);
        graphics.drawText(text, (fieldWidth - textWidth) / 2,(fieldHeight - defaultFont.getHeight()) / 2);
    }

    protected boolean navigationClick(int status, int time) {
        fieldChangeNotify(0);
        return true;
    }
}
4

1 に答える 1

2

これは、カスタムのBlackBerryボタンとフィールドを最初に実装するときに発生する非常に簡単な問題です。まず、ここでの問題はCustomButtonField、ゼロから作成されたボタンフィールドであるクラスが、その範囲内(フィールドの領域内)にあるタッチイベント(またはナビゲーションイベント)を適切に判別していないことです。

これを修正する1つの方法は、メソッドを変更し、navigationClick()メソッドを実装するtouchEvent()ことです。

   protected boolean touchEvent( TouchEvent message )    {
      int x = message.getX( 1 );        
      int y = message.getY( 1 );        
      if( x < 0 || y < 0 || x > getExtent().width || y > getExtent().height ) {
         // Outside the field            
         return false;       
      }        

      switch( message.getEvent() ) {                  
      case TouchEvent.UNCLICK:                
         fieldChangeNotify(0);               
         return true;        
      }        
      return super.touchEvent( message );    
   }

   protected boolean navigationClick(int status, int time) {
      if (status != 0) {        // you did not have this check
         fieldChangeNotify(0);
      }
      return true;
   }

私が実際にお勧めするもう1つのオプションは、クラス全体をBlackBerryの高度なUIライブラリCustomButtonFieldのサンプルの1つに置き換えることです。

BitmapButtonFieldとそれが拡張するBaseButtonFieldを使用して、適切なタッチ/クリック処理で同じ機能を実現できます。

そこにいる間に、そのライブラリにある他のUIクラスのいくつかを見てください。おそらく、それらは非常に便利であることがわかるでしょう。

于 2013-01-20T10:05:57.427 に答える