0

手動でフィールドを表示したい。

public class Main_NewsDetail extends MainScreen {
private Custom_FontField slider;
private boolean a;

public Main_NewsDetail() {
    super(USE_ALL_WIDTH);

    slider = new Custom_FontField(
            Bitmap.getBitmapResource("slider_thumb_normal.png"),
            Bitmap.getBitmapResource("slider_progress_normal.png"),
            Bitmap.getBitmapResource("slider_base_normal.png"),
            Bitmap.getBitmapResource("slider_thumb_focused.png"),
            Bitmap.getBitmapResource("slider_progress_focused.png"),
            Bitmap.getBitmapResource("slider_base_focused.png"),
            Bitmap.getBitmapResource("slider_thumb_pressed.png"),
            Bitmap.getBitmapResource("slider_progress_pressed.png"),
            Bitmap.getBitmapResource("slider_base_pressed.png"), 35, 10, 5,
            5, FOCUSABLE);
    if(a)
    add(slider);


}

public class Custom_NewsDetailBottom extends Manager implements
        FieldChangeListener {


    Custom_NewsDetailBottom() {
        super(Manager.USE_ALL_WIDTH | Manager.NO_VERTICAL_SCROLL
                | Manager.NO_HORIZONTAL_SCROLL);
        Background background = BackgroundFactory
                .createBitmapBackground(bg);
        setBackground(background);
        fontbtn = new Custom_ButtonField(font, fontactive, fontactive) {
            protected boolean navigationClick(int status, int time) {
                a = !a;   <-- here is to control field display
                return true;
            }
        };
        fontbtn.setChangeListener(this);
        add(fontbtn);


    }

    protected void sublayout(int width, int height) {
        Field field = getField(0);
        layoutChild(field, font.getWidth(), font.getHeight());
        setPositionChild(field, getGap(), 5);



        width = Math.min(width, getPreferredWidth());
        height = Math.min(height, getPreferredHeight());
        setExtent(width, height);
    }

    public int getPreferredHeight() {
        return 70;
    }

    public int getPreferredWidth() {
        return Display.getWidth();
    }

    protected void paint(Graphics graphics) {
        int rectHeight = getPreferredHeight();
        int rectWidth = getPreferredWidth();
        graphics.drawRect(0, 0, rectWidth, rectHeight);
        super.paint(graphics);
    }

    private int getGap() {
        return ((getPreferredWidth() / 4) - font.getWidth()) / 2;
    }

    public void fieldChanged(Field field, int context) {
        if (field == sharebtn) {

        } else if (field == commentbtn) {
            Main.getUiApplication().pushScreen(new Main_Comments());
        } else if (field == otherbtn) {
            Main.getUiApplication().pushScreen(new Menu_Others());
        }
    }

    public boolean keyDown(int keycode, int status) {
        if (Keypad.key(keycode) == Keypad.KEY_ESCAPE) {
            delete(slider);
            return true;
        }
        return super.keyDown(keycode, status);
    }
}
}

上記は画面を表示するコードです。fontbtnでは、クリックすると変数が変更されますtrue / false。ただし、フィールドを表示するためにインスタントを更新することはできませんslider

sliderのシークバーのようなものですAndroid。アンドロイドでは、クリックするsetvisibilityとブラックベリーRIMはできませんが、それを制御するにはどうすればよいですか?

4

2 に答える 2

0

Managerのinvalidate -methodを呼び出して、管理対象領域の再描画を強制してみてください。

Marks this entire manager as requiring repainting.
Invoke this method to signal that this manager's entire region requires repainting. 
于 2012-07-09T10:10:50.173 に答える
0

まず第一に、回避できるのであれば、このような名前の変数を使用しないことをお勧めします。

private boolean a;

コードをよりよく理解できるように、よりわかりやすい名前を付けてください。

次に、変数aが変更される前にMain_NewsDetailコンストラクターでテストしているようです。それではうまくいきません。Main_NewsDetailクラスでこれを試してみてください:

/** separate boolean used because Field.isVisible() doesn't seem totally robust */
private boolean isSliderVisible = false;

private void setSliderVisible(boolean isVisible) {
   if (isVisible != isSliderVisible) {
      if (isVisible) {
          add(slider);
      } else {
          delete(slider);
          // but, we still retain the "slider" member variable, so it can be
          // added again later
      }
      isSliderVisible = isVisible;

      // I'm not actually sure that this is needed.  I include it because I can't run this code right now!
      invalidate();
   }  
}

次に、ボタン クリック ハンドラーで次のようにします。

fontbtn = new Custom_ButtonField(font, fontactive, fontactive) {
     protected boolean navigationClick(int status, int time) {
         setSliderVisible(!isSliderVisible);
         return true;
     }
};

これで、スライダーがMain_NewsDetail1 つしかないため、このコードは機能します。Field実際に複数のFieldオブジェクトがある場合 (おそらくあるでしょう)、より複雑なロジックが必要になる場合があります。毎回同じ場所にスライダーを表示したい場合があります。indexそのために、スライダーの をすべてのフィールドのリストに記録できMain_NewsDetailます (たとえば、スライダーは 1 番目のフィールド、2 番目、5 番目のフィールドですか?)。次に、 を呼び出す代わりに、次のadd(slider)ようにします。

private void setSliderVisible(boolean isVisible) {
   if (isVisible != isSliderVisible) {
      if (isVisible) {
         insert(slider, sliderIndex);

Main_NewsDetailメソッドのサブクラスを作成しManagerて実装する必要がある場合がありますsublayout()。そうすればisSliderVisible、スライダーを常に同じ位置に配置することができます。

于 2012-07-09T10:58:18.260 に答える