【问题标题】:Blackberry - Clickable BitmapField With Different ID'sBlackberry - 具有不同 ID 的可点击位图字段
【发布时间】:2013-04-18 10:03:11
【问题描述】:

我正在创建一个应用程序,在该应用程序中,我通过 JSON 从 Web 服务器获取带有 ID 的礼物图像。当我点击任何礼物图片时,它会进入下一页,显示该图片的所有信息(通过 JSON 从 Web 服务器获取带有 ID 的图片信息)。

问题是:当我点击页面上的任何礼物图片查看其相关信息时,它每次都会获取最后一个礼物图片id,我希望当我点击任何图片时,它会获取我点击的特定图片id。怎么可能??

页面截图为:http://ugo.offroadstudios.com/gifts.png

这里是示例代码:

public class Gifts extends MainScreen {

    String giftsid;
    BitmapField giftimg;

    public Gifts(){
        setTitle("Gift Store");
        creategifts();
    }

    public void creategifts()
    {
        //Link URL
        String strURL = "http://ugo.offroadstudios.com/api/frndgift/?loginusername=adil;deviceside=true";
        webConnection wb = new webConnection();
        String res = wb.getJson(strURL);

        try {
            JSONObject object = new JSONObject(res);
            if(object.getString("status") == "error")
            {
                Dialog.alert("Invalid "+object.getString("status"));
            }
            else
            {
                int totalgifts;
                totalgifts = object.getInt("totalgifts");
                Bitmap listThumb;
                JSONArray imagearr;
                JSONArray giftsidarr;
                String imgname;
                Bitmap bmpResized;

                for(int i=0;  i < totalgifts; i++){
                    imagearr = object.getJSONArray("gifts_image");
                    imgname = imagearr.getString(i);
                    giftsidarr = object.getJSONArray("gifts_id");
                    giftsid = giftsidarr.getString(i);

                    listThumb = getImage.getImageFromUrl("http://ugo.offroadstudios.com/wp-content/plugins/bp-gifts-rebirth/includes/images/"+imgname+";deviceside=true");
                    bmpResized = GPATools.ResizeTransparentBitmap(listThumb, 80, 80,
                    Bitmap.FILTER_LANCZOS, Bitmap.SCALE_TO_FIT);

                    giftimg =new BitmapField(bmpResized,FOCUSABLE)
                    {
                        protected boolean navigationClick(int status, int time)
                        {
                            Dialog.alert("giftsid "+giftsid);
                            UiApplication.getUiApplication().pushScreen(new SendGift(giftsid));
                            return true;
                        }
                    };
                    add(giftimg);
                }
            }

        }
        catch (JSONException e) {
            System.out.println("EX is "+e);
            e.printStackTrace();
        }
    }
}

【问题讨论】:

    标签: blackberry


    【解决方案1】:

    您总是会获得列表中最后一个礼物的礼物 ID,因为您使用以下代码创建了按钮:

    giftimg =new BitmapField(bmpResized,FOCUSABLE)
    {
        protected boolean navigationClick(int status, int time)
        {
            Dialog.alert("giftsid "+giftsid);
            UiApplication.getUiApplication().pushScreen(new SendGift(giftsid));
            return true;
        }
    };
    

    您的navigationClick() 方法使用了giftsid 变量,这是您的类的持久成员变量。您在 for 循环中分配此变量,因此它保留的最终值是循环中分配的最后一个值 (giftsidarr.getString(totalgifts))。

    虽然您在循环中声明navigationClick() 方法,其中giftsid 有许多不同的值,但navigationClick() 方法在运行时使用giftsid 的值。最后一个值。

    有很多方法可以解决它。您可以在循环中使用单独的常量值:

    final String nextGiftsId = giftsid;
    
    giftimg =new BitmapField(bmpResized,FOCUSABLE)
    {
        protected boolean navigationClick(int status, int time)
        {
            Dialog.alert("nextGiftsId= "+nextGiftsId);
            UiApplication.getUiApplication().pushScreen(new SendGift(nextGiftsId));
            return true;
        }
    };
    

    或者,按照 Signare 的建议,在每个按钮上附加一个 cookie,以标识其对应的礼物:

    giftimg =new BitmapField(bmpResized,FOCUSABLE)
    {
        protected boolean navigationClick(int status, int time)
        {
            String giftId = (String)getCookie();   // read gift id from the cookie
            Dialog.alert("giftId= "+giftId);
            UiApplication.getUiApplication().pushScreen(new SendGift(giftId));
            return true;
        }
    };
    giftimg.setCookie(giftsid);  // set the cookie after creating the field
    

    【讨论】:

      【解决方案2】:

      在你的 for 循环中,添加以下代码 -

      giftimg[i].setChangeListener(this);
      

      那么——

      public void fieldChanged(Field field, int context) {
      for(int i=0;i<totalgifts;i++) {
          if(field == giftimg[i]) {
              // you can trigger your event 
          }
      }
      

      编辑:-

      giftimg[i].setChangeListener(listener);
      
      listener = new FieldChangeListener() {
                  public void fieldChanged(Field field, int context) {
                      if ( field instanceof BitmapField ) {
                          for(int i=0;i<totalgifts;i++) {
                              if ( field == giftimg[i] ) {
                                 // you can trigger your event 
                              }
                          }
                      }
                  }
              };
      

      【讨论】:

      • 否则您可以为每个图像按钮设置 cookie。检查 API 参考。
      • 谢谢Signare,当我使用giftimg[i].setChangeListener(this);在代码中它给出了一个错误“表达式的类型必须是数组类型,但它解析为 BitmapField”。
      • 对不起Signare,我仍然在这里遇到问题。
      • 我需要当我点击任何图片时,它会获得来自 json(giftsid) 的可点击图片 ID,并在下一页显示该图片的更多信息。问题是当我点击页面上的任何图像并在下一页上仅显示最后一个图像 ID 的数据时,它只获得最后一个图像 ID。
      • 不,因为它在 giftimg[i] 和 setChangeListener 事件中给了我错误。
      猜你喜欢
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多