Checkbox with a ObjectListField not focusable and

2019-08-29 13:25发布

问题:

I am trying to create a checkbox and below this objectlist is there. I am trying to focus on checkbox but it is niether focusable nor checkable .The focus stands on the first element of the list below.

How I can focus the checkbox as well as making it checkable? Here, checkbox is in a VerticalFieldManager in which I am adding the list.

Here I am adding two things:one is Horizontal Field Manager(onlineCheckBoxHfm) and other is objectListField(buddyList).

Now problem is, default focus is on first element of the list and I am unable to get focus on HorizontalFieldManager in which I have put the CheckBox. Since focus is not available on HorizontalFieldManager so I am unable to check the CheckBox.

public class BuddyMenuItem extends VerticalFieldManager implements FieldChangeListener{   

 public BuddyMenuItem(BuddyListField buddyList) {

        _bitmap = EncodedImage.
        getEncodedImageResource("buddies_header.png");
        mainMenuBmp = new BitmapField(Constant.sizePic(_bitmap, _bitmap.getHeight(), Display.getWidth()));

        HorizontalFieldManager onlineCheckBoxHfm=new HorizontalFieldManager(HorizontalFieldManager.USE_ALL_WIDTH);
        _onlineCheckBox=new CheckboxField("Online",false,CheckboxField.FIELD_LEFT|CheckboxField.FOCUSABLE);
        _onlineCheckBox.setChangeListener(this);

        onlineCheckBoxHfm.add(_onlineCheckBox);
        onlineCheckBoxHfm.add(new NullField(NullField.FOCUSABLE));
//      add(mainMenuBmp);
        add(onlineCheckBoxHfm);
        add(buddyList);
    }

BuddyListField class is as follows:

import java.util.Vector;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Keypad;
import net.rim.device.api.ui.TouchEvent;
import net.rim.device.api.ui.Touchscreen;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ObjectListField;

import com.np.naijapings.Buddy;
import com.np.naijapings.NaijapingsMain;

public class BuddyListField extends ObjectListField {
    public static final Bitmap offlineIcon = Bitmap.getBitmapResource("offline.png");
    public static final Bitmap awayIcon = Bitmap.getBitmapResource("away.png");
    public static final Bitmap busyIcon = Bitmap.getBitmapResource("busy.png");
    public static final Bitmap onlineIcon = Bitmap.getBitmapResource("online.png");
    public static final Bitmap unreadIcon = Bitmap.getBitmapResource("unread.png");
    public static final Bitmap maleIcon=Bitmap.getBitmapResource("male.png");

    public static final Bitmap[] statusIcon = new Bitmap[]{offlineIcon, awayIcon, busyIcon, onlineIcon};

    public static Vector buddyVector;
    public static int onlineBuddyCount=0;
    private final NPingsMain nPings;
    public static boolean showOnlineBuddy=false;

    private Bitmap _chatBmp=Bitmap.getBitmapResource("chat.png");

    public BuddyListField(NPingsMain n,boolean showOnlineBuddy) {
        nPings = n;
        buddyVector = new Vector();
        this.showOnlineBuddy=showOnlineBuddy;
    }

    public Buddy getBuddyAt(int index) {
        return (Buddy)buddyVector.elementAt(index);     
    }

    protected boolean keyChar(char key, int status, int time) {
        int idx;
        switch(key) {
        case Keypad.KEY_ENTER:
            idx = this.getSelectedIndex();
            if (idx >= 0) {
                NPingsMain.currentBuddy = (Buddy)buddyVector.elementAt(idx);
                NPingsMain.openBuddy(NPingsMain.currentBuddy);
            }
            return true;

        case 'e':
            idx = this.getSelectedIndex()-1;
            if (idx >= 0) {
                this.setSelectedIndex(idx);
            }
            return true;

        case 's':
            return true;

        case 'f':
            return true;

        case 'x':
            idx = this.getSelectedIndex()+1;
            if (idx > 0 && idx < this.getSize()) {
                this.setSelectedIndex(idx);
            }
            return true;

        case 't':
            if (this.getSize() > 0) {
                this.setSelectedIndex(0);
            }
            return true;
        }

        return false;
    }
    protected boolean navigationClick(int status, int time) {
        int idx = this.getSelectedIndex();
        if(Touchscreen.isSupported()){
            if (idx >= 0) {
                nPings.currentBuddy = (Buddy)buddyVector.elementAt(idx);
                if((nPings.currentBuddy.status==0x00000003)||(nPings.currentBuddy.status==0x00000002)||(nPings.currentBuddy.status==0x00000001)){
                    NPingsMain.openBuddy(nPings.currentBuddy);
                }
            }
            return false;
        }else{

            if (idx >= 0) {
                nPings.currentBuddy = (Buddy)buddyVector.elementAt(idx);
                if((nPings.currentBuddy.status==0x00000003)||(nPings.currentBuddy.status==0x00000002)||(nPings.currentBuddy.status==0x00000001)){
                    NPingsMain.openBuddy(nPings.currentBuddy);
                }
            }
            return false;
        }
    }
    protected boolean touchEvent(TouchEvent message) {
        //if(message.getEvent()==TouchEvent.CLICK){
            int idx;
            switch(TouchEvent.CLICK) {
            case TouchEvent.CLICK:
                idx = this.getSelectedIndex();
                if (idx >= 0) {
                    nPings.currentBuddy = (Buddy)buddyVector.elementAt(idx);
                    if((nPings.currentBuddy.status==0x00000003)||(nPings.currentBuddy.status==0x00000002)||(nPings.currentBuddy.status==0x00000001)){
                        NPingsMain.openBuddy(nPings.currentBuddy);
                    }
                }
                return true;

            case 'e':
                idx = this.getSelectedIndex()-1;
                if (idx >= 0) {
                    this.setSelectedIndex(idx);
                }
                return true;

            case 's':
                return true;

            case 'f':
                return true;

            case 'x':
                idx = this.getSelectedIndex()+1;
                if (idx > 0 && idx < this.getSize()) {
                    this.setSelectedIndex(idx);
                }
                return true;

            case 't':
                if (this.getSize() > 0) {
                    this.setSelectedIndex(0);
                }
                return true;
            }

        //  return false;

    //  }
        return super.touchEvent(message);
    }

    public void buddyReposition(Buddy b) {
        int index = buddyVector.indexOf(b);
        buddyReposition(index);
    }

    public void buddyReposition(int oldIndex) {
        Buddy b = (Buddy)buddyVector.elementAt(oldIndex);
        int newIndex = 0;

        if (b.unread) {
            newIndex = 0;
        } else {
            while (newIndex < buddyVector.size() &&
                    ((b == (Buddy)buddyVector.elementAt(newIndex)) || 
                            ((Buddy)buddyVector.elementAt(newIndex)).unread || 
                            (b.status < ((Buddy)buddyVector.elementAt(newIndex)).status)))
                ++newIndex;
        }

        newIndex = (oldIndex < newIndex) ? (newIndex-1) : newIndex;

        if (oldIndex != newIndex) {
            buddyVector.removeElementAt(oldIndex);
            buddyVector.insertElementAt(b, newIndex);
        }

        this.invalidate();
    }

    public int findBuddyIndex(String jid) {
        for (int i = buddyVector.size()-1; i >= 0; i--) {
            if (((Buddy)buddyVector.elementAt(i)).jid.equals(jid))
                return i;
        }

        return -1;
    }

    public Buddy findBuddy(String jid) {
        for (int i = buddyVector.size()-1; i >= 0; i--) {
            if (((Buddy)buddyVector.elementAt(i)).jid.equals(jid))
                return (Buddy)buddyVector.elementAt(i);
        }
        return null;
    }

    public void addBuddy(Buddy b) {
        //CHECK FOR ONLINE BUDDIES  
        buddyVector.addElement(b);
        this.insert(buddyVector.indexOf(b));

    }

    public void deleteBuddy(int index){
        buddyVector.removeElementAt(index);
        this.delete(index);

    }

    public void drawListRow(ListField listField, Graphics graphics, int index, int y, int width) {
        // NOTICE 14 would be consist the icon size

        onlineBuddyCount=0; 
        String bName="";
        Buddy b = (Buddy)buddyVector.elementAt(index);
        if(showOnlineBuddy==true){
            if(b.status==0x00000003||b.status==0x00000002||b.status==0x00000001){

                //DRAW ROW BACKGROUND START
                if (listField.getSelectedIndex() != index) {
                    graphics.setBackgroundColor(index % 2 == 0 ? Color.WHITE
                            : Color.LIGHTGRAY);
                    graphics.clear();
                    listField.setFocus();
                }
                //DRAW ROW BACKGROUND END

                onlineBuddyCount++;
                if(b.name.endsWith("net")){
                    int i=b.name.indexOf("@");
                    bName=b.name.substring(0, i);
                }else{
                    bName=b.name;
                }
                if (b.unread) {
                    graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),unreadIcon , 0, 0);
                } else {
                    graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),statusIcon[b.status] , 0, 0);
                }

                graphics.drawText(bName, 25, y, DrawStyle.HDEFAULT, width-12);
                graphics.drawBitmap(Display.getWidth()-_chatBmp.getWidth(), y-6, _chatBmp.getWidth(), _chatBmp.getHeight(), _chatBmp, 0, 0);
            }
        }else{
            //DRAW ROW BACKGROUND START
            if (listField.getSelectedIndex() != index) {
                graphics.setBackgroundColor(index % 2 == 0 ? Color.WHITE
                        : Color.LIGHTGRAY);
                graphics.clear();
                listField.setFocus();
            }
            //DRAW ROW BACKGROUND END

            onlineBuddyCount++;
            if(b.name.endsWith("net")){
                int i=b.name.indexOf("@");
                bName=b.name.substring(0, i);
            }else{
                bName=b.name;
            }
            if (b.unread) {
                graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),unreadIcon , 0, 0);
            } else {
                graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),statusIcon[b.status] , 0, 0);
            }

            graphics.drawText(bName, 25, y, DrawStyle.HDEFAULT, width-12);
            graphics.drawBitmap(Display.getWidth()-_chatBmp.getWidth(), y-6, _chatBmp.getWidth(), _chatBmp.getHeight(), _chatBmp, 0, 0);
        }
    }



    public void clearBuddies() {
        if (nPings.buddyList != null) {
            int i = buddyVector.size();
            while (i-- > 0)
                this.delete(0);
            nPings.buddyscreen.delete(nPings.buddyList);
            nPings.buddyList = null;
        }
    }
}

回答1:

I can't run your code, because there's too much in there that I don't have (other classes, PNGs, etc.), but I would be willing to bet that your problem is here:

public void drawListRow(ListField listField, Graphics graphics, int index, int y, int width) {

   // other stuff here

      listField.setFocus();

Calling setFocus() will set the focus on the list field (the BuddyListField). So, your CheckBoxField is actually focusable. The problem is that you add the checkbox field, and then add the listfield. When the listfield is drawn, with drawListRow(), you are always taking focus away from the checkbox and putting it back on the listfield.

Remove that call to listField.setFocus() ... there are two of them.

drawListRow() is meant for drawing. I'm not sure I can think of a reason why anything in that method should actually change the focus, which is what setFocus() does.