Как сделать HorizontalFieldManager кликабельным в BlackBerry?

Я разрабатываю приложение в BlackBerry, и у меня есть много HorizontalFieldManager, заполненных компонентами, как показано на рисунке ниже:

Мой HorizontalFieldManager заполнен компонентами

И мне нужно добавить много таких HorizontalFieldManager в for цикл, который динамически заполняется. В совокупности это выглядит как одна строка в списке. До сих пор я был в состоянии сделать это.

Но проблема в том, что пользователь должен иметь возможность нажимать на такую ​​строку . Но так как HorizontalFieldManager не фокусируется и не активируется, и поскольку в нем 4 компонента, а все 4 одинаково важны, я не был в состоянии найти способ сделать это.

Итак, кто-нибудь может предложить способ сделать то, что я пытаюсь? По сути, пользователь должен иметь возможность щелкнуть «строку», которая показана на изображении. Эта «строка» состоит из множества компонентов (2 HorizontalFieldManager s, 1 VerticalFieldManager, 1 BitmapField и 3 LabelFields).

Любая помощь очень ценится!

4 голоса | спросил Roshnal 6 PMpFri, 06 Apr 2012 13:30:11 +040030Friday 2012, 13:30:11

3 ответа


0

BBdev прямо ответил на ваш вопрос, но, как вы заметили, производительность довольно низкая. Это связано с тем, что использование менеджера для удаления сотен строк, как это, добавляет много накладных расходов на шаг макета пользовательского интерфейса. Макет будет работать со всеми этими менеджерами, каждый раз, когда что-то меняется на экране - в том числе каждый раз, когда вы добавляете новую строку. Это принципиально квадратично.

Чтобы ускорить это, используйте ListField . Единственная болевая точка ListField заключается в том, что вам приходится рисовать напрямую, а не полагаться на стандартные поля ОС. Но преимущество в том, что ListField работает очень быстро - каждая строка имеет фиксированную высоту, поэтому ListField может быстро определить, какие строки видны, а затем вызвать код рисования только для этих строк.

Это означает, что работа масштабируется с видимым размером поля, а не с виртуальным размером поля. Это очень желательное свойство для сохранения при написании кода пользовательского интерфейса, поскольку виртуальная глубина пользовательского интерфейса не имеет границ, но физический экран имеет фиксированное количество пикселей, поэтому, масштабируя работу с видимой частью пользовательского интерфейса, вы сохраняете хорошая производительность.

ответил Michael Donohue 8 PMpSun, 08 Apr 2012 22:45:27 +040045Sunday 2012, 22:45:27
0

Приведенный ниже код сделает ваш HorizontalFieldManager кликабельным и добавит ваш компонент в этот Hfm, как вы хотите.

import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.TouchEvent;
import net.rim.device.api.ui.Touchscreen;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.NullField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;

public class sample extends MainScreen implements FieldChangeListener{

 HorizontalFieldManager logInDetailManager=null;
 int background_color=0;

 public sample() {

logInDetailManager = new HorizontalFieldManager(Manager.USE_ALL_WIDTH|Field.FOCUSABLE){
    protected void sublayout(int maxWidth, int maxHeight) {
            int height=40;
        super.sublayout(Display.getWidth(), height);
        setExtent(Display.getWidth(), height);
    }
    protected void paint(Graphics graphics) {

        graphics.setBackgroundColor(background_color);
        graphics.clear();
        invalidate();
        super.paint(graphics);
    }
    protected void onFocus(int direction) {
        super.onFocus(direction);
        background_color=Color.RED;
        invalidate();
    }
    protected void onUnfocus() {
        invalidate();
        background_color=Color.GREEN;

    }
    protected boolean navigationClick(int status, int time) {

        if(Touchscreen.isSupported()){
            return false;
        }else{
            fieldChangeNotify(1);
            return true;
        }

    }
    protected boolean touchEvent(TouchEvent message)
    {
        if (TouchEvent.CLICK == message.getEvent())
        {
            FieldChangeListener listener = getChangeListener();
            if (null != listener)
                this.setFocus();
                listener.fieldChanged(this, 1);
        }
        return super.touchEvent(message);
    }
};
logInDetailManager.setChangeListener(this);
logInDetailManager.add(new LabelField("hello"));
logInDetailManager.add(new NullField(Field.FOCUSABLE));
add(logInDetailManager);
add(new LabelField("good",Field.FOCUSABLE));    
}

  public void fieldChanged(Field field, int context) {            
if(field==logInDetailManager){                  
    UiApplication.getUiApplication().invokeLater(new Runnable() {                          
        public void run() {                                 
            Dialog.inform("Hi how are you?");                          
        }                    
    });          
}   
}

}

Надеюсь, это поможет вам. Ура :)

ответил BBdev 6 PMpFri, 06 Apr 2012 14:21:53 +040021Friday 2012, 14:21:53
0

Как обработать цвет фокуса, когда вместо этого у вас есть массив горизонтальных полей?

for (int i = 0; i < listSize; i++) {
        logInDetailManager[i] = new HorizontalFieldManager(
                Manager.USE_ALL_WIDTH | Field.FOCUSABLE) {

Поскольку один элемент массива всегда сфокусирован, весь список весь красный.

ответил Musipoo 18 MarpmMon, 18 Mar 2013 18:11:39 +04002013-03-18T18:11:39+04:0006 2013, 18:11:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132