3

J'essaie de créer une case à cocher et en dessous de cette liste d'objets est là. J'essaie de me concentrer sur la case à cocher, mais elle n'est ni focalisable ni vérifiable. L'accent est mis sur le premier élément de la liste ci-dessous.Case à cocher avec un ObjectListField non focalisable et vérifiable?

Comment puis-je activer la case à cocher et la rendre vérifiable? Ici, la case à cocher est dans un VerticalFieldManager dans lequel j'ajoute la liste.

enter image description here

Ici, je suis d'ajouter deux choses: l'une est horizontale Gestionnaire de champs (onlineCheckBoxHfm) et d'autres est objectListField (Buddylist).

Maintenant le problème est, le focus par défaut est sur le premier élément de la liste et je suis incapable de se concentrer sur HorizontalFieldManager dans lequel j'ai placé le CheckBox. Étant donné que le focus n'est pas disponible sur HorizontalFieldManager, je ne peux pas vérifier le 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); 
    } 

classe BuddyListField est la suivante:

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; 
     } 
    } 
} 
+2

Veuillez indiquer le code que vous utilisez pour créer votre CheckBoxField et l'ajouter à un gestionnaire (avec ObjectListField), puis à l'écran. Merci. – Nate

+0

Je ne pense pas que ce soit quelque chose dans le code que vous montrez. Si 'BuddyListField' est juste un' ObjectListField', alors je suis capable de me concentrer et de cocher la case. Peut-être que vous pouvez poster la classe 'BuddyListField', et aussi nous dire quelle classe' BuddyMenuItem' * étend *? – Nate

+0

@Nate: J'ai mis à jour le code, avec la classe BuddyListField. –

Répondre

1

Je ne peux pas exécuter votre code, parce qu'il ya trop là-dedans que je n'ai pas (autres classes, PNGs, etc.), mais je serais prêt à parier que votre problème est ici:

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

    // other stuff here 

     listField.setFocus(); 

appel setFocus() va se t l'accent sur le champ de liste (BuddyListField). Donc, votre CheckBoxFieldest réellement focalisable. Le problème est que vous ajoutez le champ case à cocher, puis ajoutez le champ liste. Lorsque le champ de liste est dessiné, avec drawListRow(), vous vous détachez toujours de la case pour le remettre sur la liste.

Supprimez cet appel à listField.setFocus() ... il y en a deux.

drawListRow() est destiné au dessin. Je ne suis pas sûr que je peux penser à une raison pour laquelle quoi que ce soit dans cette méthode devrait changer la mise au point, ce qui est ce que fait setFocus().

+0

Merci Nate.C'était juste à cause de la méthode ** setFocus() **, checkbox n'obtenait pas de focus.J'ai retiré le focus de là et maintenant son fonctionnement. –