2

下部のタブを使用する必要があるBlackBerryアプリケーションで作業しています。

以前、私はすでにタブを使用していましたが、画面の上部にあります。画面の下部にタブを配置するために、私はこのsublayout()方法を使用しました。しかし、これの副作用は、私がdisplay(index)現在この方法を使用できないことです。いずれかのタブをクリックするたびに、最初のタブのみが選択されます。sublayout()メソッドを非表示にすると、すべてが正常に機能します。

これは私が使用している私のコードです:

TabControl.java

public class TabControl extends MainScreen{
    public static int tabHeight = 0;
    public static TabField mTabField = null;
    public static Bitmap BACKGROUND_IMAGE = Bitmap
    .getBitmapResource("Background_Superhero.png");
    private UiApplication uiApp = UiApplication.getUiApplication();
    private UiEngine ui = Ui.getUiEngine();
    private int displayHieght;
    public TabControl(BuddyListField buddyList) {
        super(MainScreen.NO_VERTICAL_SCROLL);
    }
    public void addFields() {
        try {
            mTabField = new TabField(this);
            add(mTabField);
            HomeTab home = new HomeTab();
            mTabField.addTab(Bitmap.getBitmapResource("home_tab.png"), home,
                    Field.FOCUSABLE);
            SettingTab setting = new SettingTab();
            mTabField.addTab(Bitmap.getBitmapResource("Setting_tab.png"), setting,
                    Field.FOCUSABLE);
            AboutTab about = new AboutTab();
            mTabField.addTab(Bitmap.getBitmapResource("abouttab.png"), about,
                    Field.FOCUSABLE);

            mTabField.setDefault(Constant.SETTING_TAB_INDEX);
        } catch (Exception e) {
            System.out.println(e+"=-====>>TabControl");
            e.printStackTrace();
        }
    }
    protected boolean keyDown(int keycode, int time) {
        if (keycode == 1769472) {
            // escape pressed
            return true;
        }
        return super.keyDown(keycode, time);
    }
}

TabField.java

public class TabField extends VerticalFieldManager {


    private static Bitmap tabBackGroundImage = Bitmap
    .getBitmapResource("tab_bar.png");
    private Background CONTROL_NORMAL_BG = BackgroundFactory
    .createBitmapBackground(tabBackGroundImage);
    private Background CONTROL_ACTIVE_BG = BackgroundFactory
    .createSolidBackground(Color.SILVER);

    public static int indexValue = 0;
    private static int mCurrentIndex = 0;
    private int mDefault = 0;

    private Field mCurrentField = null;
    private Vector mTabFields = new Vector();
    private MainScreen _mainscreen = null;
    private HorizontalFieldManager mTabController = new HorizontalFieldManager();

    private UiApplication uiApp = UiApplication.getUiApplication();
    private UiEngine ui = Ui.getUiEngine();
    private int tabHieght;
    private int displayHieght;


    public TabField(MainScreen mainscreen) {
        super(MainScreen.USE_ALL_HEIGHT);
        _mainscreen = mainscreen;
        displayHieght = Display.getHeight();

        add(mTabController);
        SeparatorField separatorField = new SeparatorField();
        separatorField.setBackground(CONTROL_ACTIVE_BG);
        add(separatorField);

    }

    public void setDefault(int index) {
        mDefault = index;
        if (mDefault <= mTabFields.size() - 1) {
            display(mDefault);
        }
    }

    public void display(int index) {
        VirtualKeyboard virtKbd = _mainscreen.getVirtualKeyboard();
        if(virtKbd != null)
            virtKbd.setVisibility(VirtualKeyboard.RESTORE);

        try {
            if (mCurrentField != null) {
                if (mCurrentField instanceof TabFieldItem) {
                    ((TabFieldItem) mCurrentField).onUnSelected();
                }
                delete(mCurrentField);
            }
            mCurrentField = (Field) mTabFields.elementAt(index);
            add(mCurrentField);
            mCurrentField.setFocus();

            if (mCurrentField instanceof TabFieldItem) {
                ((TabFieldItem) mCurrentField).onSelected();
            }

            setDirty(false);
            BitmapField mCurrentBG = (BitmapField) mTabController
            .getField(mCurrentIndex);

            mCurrentBG.setBackground(CONTROL_NORMAL_BG);
            mCurrentBG.setBitmap(getOnUnFocusImg(mCurrentIndex));
            BitmapField mBG = (BitmapField) mTabController.getField(index);
            mBG.setBackground(CONTROL_ACTIVE_BG);
            mBG.setBitmap(getOnFocusImg(index));
            mCurrentIndex = index;
            if(virtKbd != null)
                virtKbd.setVisibility(VirtualKeyboard.HIDE);
            if (indexValue == 3) {


            }
        } catch (Exception e) {
            System.out.println("Exception: In TabField--->display() "
                    + e.toString());
        }
    }

    public void addTab(Bitmap aBitmap, final Field aTabField, long style) {
        BitmapField lButton = null;
        if (style == Field.FOCUSABLE) {
            final BitmapField focusbleButton = new BitmapField(aBitmap,
                    Field.FOCUSABLE) {
                protected boolean navigationClick(int status, int time) {
                    if (aTabField == null) {
                        return false; 
                    }
                    indexValue = getIndex();
                    display(indexValue);
                    return true;
                }

                protected void paint(Graphics graphics) {
                    if (indexValue == getIndex()) {
                        graphics.setBackgroundColor(Color.SILVER);
                        graphics.clear();
                    }
                    super.paint(graphics);
                }

                public void setSpace(int hSpace, int vSpace) {

                    super.setSpace(hSpace, vSpace);
                }
            };
            focusbleButton.setBackground(CONTROL_NORMAL_BG);
            setlButtonSpace(focusbleButton);
            lButton = focusbleButton;
        } else {
            lButton = new BitmapField(aBitmap);
        }
        /*if (WallpaperMainScreen.tabHeight == 0)
            WallpaperMainScreen.tabHeight = lButton.getBitmapHeight();*/
        mTabController.add(lButton);
        mTabFields.addElement(aTabField);

        if (mDefault == mTabFields.size() - 1 && aTabField != null) {
            display(mDefault);
        }
    }

    //SUBLAYOUT METHOD USED TO BRING THE TABBAR AT THE BOTTOM OF THE SCREEN---------------
    protected void sublayout(int maxWidth, int maxHeight) {
        super.sublayout(maxWidth, maxHeight);
        tabHieght = mTabController.getHeight();
        int y = displayHieght - tabHieght;
        setPositionChild(mTabController, 0, y);
    }


    private void setlButtonSpace(BitmapField lButton) {
        int tabWidth = Display.getWidth() / 3;
        int imagewidth = lButton.getBitmapWidth();
        int imageheight = lButton.getBitmapHeight();
        int hPaddingValue = (tabWidth - imagewidth) / 2;
        int vPaddingValue = (tabWidth - imageheight) / 7;
        lButton.setSpace(hPaddingValue + 1, vPaddingValue);
    }

    private Bitmap getOnFocusImg(int index) {
        Bitmap image = null;
        switch (index) {
        case 0:
            image = Bitmap.getBitmapResource("home_tab.png");
            break;
        case 1:
            image = Bitmap.getBitmapResource("Setting_tab.png");
            break;
        case 2:
            image = Bitmap.getBitmapResource("about_tab.png");
            break;
        /*case 3:
            image = Bitmap.getBitmapResource("exit_tab.png");
            break;
*/
        }
        return image;
    }

    private Bitmap getOnUnFocusImg(int currentIndex) {
        Bitmap image = null;
        switch (currentIndex) {
        case 0:
            image = Bitmap.getBitmapResource("home_tab.png");
            break;
        case 1:
            image = Bitmap.getBitmapResource("Setting_tab.png");
            break;
        case 2:
            image = Bitmap.getBitmapResource("about_tab.png");
            break;
        /*case 3:
            image = Bitmap.getBitmapResource("exit_tab.png");
            break;*/
        }
        return image;

    }


    protected boolean keyChar(char ch, int status, int time) {
        if (mCurrentField != null && mCurrentField instanceof TabFieldItem) {
            return ((TabFieldItem) mCurrentField).keyChar(ch, status, time);
        } else {
            return super.keyChar(ch, status, time);
        }
    }
}

TabFieldItem.java

package com.np.custom;

public interface TabFieldItem {
    /**
     * Method invoked when the tabField is about to be displayed
     */
    public void onSelected();

    /**
     * Method invoked when the tabField is about to be removed from the display
     */
    public void onUnSelected();

    public boolean keyChar(char ch, int status, int time);

}

TabField.javaクラスのsublyoutメソッドを使用しました。結果は画像のようになります。

ここに画像の説明を入力してください

4

5 に答える 5

1

'add(mTabController)'の上にマネージャーを追加し、そのマネージャーの固定の高さをサブレイアウトにオーバーライドし、サブレイアウト内にsetextentを設定します。高さはdisplayheight-mtabcontrollerの高さである必要があります。そして、タブフィールドクラスでオーバーライドされたサブレイアウトを削除します。

于 2012-08-03T08:29:32.023 に答える
1

サブレイアウトをオーバーライドする代わりに、setStatus(mTabField)を使用してみてください。

于 2012-07-29T02:30:50.917 に答える
1

私が持っているであろういくつかの推奨事項があります。

まず、このようなものを構築する場合、特にBlackBerryの場合、すべてのクリック処理またはフォーカス処理を正しく行うのは非常に難しい場合があります。通常、RIMの例の1つから始めることをお勧めします。これは、機能することがわかっています。この場合、ここでタブバーの例を見ることができます。

コードを使い続けたい場合は、問題になる可能性のあることがいくつかあります。

//SUBLAYOUT METHOD USED TO BRING THE TABBAR AT THE BOTTOM OF THE SCREEN---------------
protected void sublayout(int maxWidth, int maxHeight) {
    super.sublayout(maxWidth, maxHeight);
    tabHieght = mTabController.getHeight();
    int y = displayHieght - tabHieght;
    setPositionChild(mTabController, 0, y);
}
  1. を実装するときは、通常、自分が持っている子フィールドごとにsublayout()を呼び出す必要があります。呼び出しているだけです。多くの場合、電話も適切です。setPositionChild()layoutChild()ManagersetPositionChild()setExtent()

  2. 私は最近、人々がオーバーライドVerticalFieldManager(またはHorizontalFieldManager)し、それでもオーバーライドsublayout()してカスタムレイアウト管理を提供するという多くの問題を目にしました。VerticalFieldManagerそれはあなたのために垂直レイアウトを実行し、あなたがそれらの順序で子フィールドをレイアウトするので、それはそもそも使用の目的を無効にしadd()ます。カスタマイズが必要な場合は、ではManagerなく、を拡張することをお勧めしVerticalFieldManagerます。デフォルトのVerticalFieldManagerレイアウトが希望どおりでない場合は、Manager必要な完全な実装を提供するだけです。それほど難しいことではありません。sublayout()、、getPreferredWidth()を実装するだけgetPreferredHeight()です。

もちろん、それでもsublayout()正しく実装する必要があります(上記の1を参照)。

とにかく、同様の問題を投稿した他の人々も、クラスを(TabFieldあなたのために)に変更するまで、奇妙な振る舞いを見ていましたextends Manager。それは私が最初に修正しようとするものです。

于 2012-07-29T09:43:49.573 に答える
0

タブバーの例として、Blackberry JDE(4.5以降)で新しいプロジェクトを作成します。

以下のコードをコピーして実行してください。

MyTabAppDemo.java

package com.app;

import net.rim.device.api.ui.UiApplication;

public class MyTabAppDemo extends UiApplication
{   public static void main(String[] args)
    {   MyApp theApp = new MyApp();       
        theApp.enterEventDispatcher();
    }
    public MyApp()
    {             
        pushScreen(new TabScreenExample());
    }    
}

TabScreenExample.java

package com.app;

import net.rim.device.api.system.Application;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;

public class TabScreenExample extends MainScreen {
    private VerticalFieldManager mainManager;
    private NavigationMenuBar tabBar;

    public TabScreenExample() {
        tabBar = new NavigationMenuBar() {

            public void onNavigationClick(int selection) {
                if (NavigationMenuBar.TAB1 == selection) {
                    // Push Screen Which is releted to first tab
                    synchronized (Application.getEventLock()) {
                        UiApplication.getUiApplication().pushScreen(new Screan1());
                    }
                } else if (NavigationMenuBar.TAB2 == selection) {
                    // Push Screen Which is releted to second tab
                    synchronized (Application.getEventLock()) {
                        UiApplication.getUiApplication().pushScreen(new Screan2());
                    }
                }
            }
        };
        mainManager = new VerticalFieldManager() {
            protected void sublayout(int maxWidth, int maxHeight) {
                super.sublayout(maxWidth, maxHeight);
                setExtent(getPreferredWidth(), getPreferredHeight());
            }

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

            public int getPreferredHeight() {
                return Display.getHeight() - tabBar.getPreferredHeight();
            }
        };

        add(mainManager);
        add(tabBar);
    }
}

//これがカスタムタブバーです。このタブバーには、多くのタブを追加できます。

NavigationMenuBar.java

package com.app;

import net.rim.device.api.system.Application;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.KeypadUtil;
import net.rim.device.api.ui.container.HorizontalFieldManager;

public abstract class NavigationMenuBar extends HorizontalFieldManager {

    public static final int TAB1 = 0;
    public static final int TAB2 = 1;

    // Create object of tabs
    private TopBarComponenet tab1;
    private TopBarComponenet tab2;

    // Selected Tab;
    private int currentState;

    // tab Normal Image
    private Bitmap imgTab1Normal, imgTab2Normal;

    // tab Focus Image
    private Bitmap imgTab1Focus, imgTab2Focus;

    public NavigationMenuBar() {

        // Normal Images
        imgTab1Normal = Bitmap.getBitmapResource("tab1Normal.png");
        imgTab2Normal = Bitmap.getBitmapResource("tab2Normal.png");

        // Focus Images
        imgTab1Focus = Bitmap.getBitmapResource("tab1Focus.png");
        imgTab2Focus = Bitmap.getBitmapResource("tab2Focus.png");

        // create first tab
        tab1 = new TopBarComponenet(imgTab1Normal) {

            protected void onClick() {
                currentState = TAB1;
                selectTab(currentState);
            }
        };
        // create Second tab
        tab2 = new TopBarComponenet(imgTab2Normal) {

            protected void onClick() {
                currentState = TAB2;
                selectTab(currentState);
            }
        };

        // add tab button in horizontal manager.
        add(tab1);
        add(tab2);
    }

    public int getPreferredHeight() {
        return imgTab1Normal.getHeight();
    }

    public void selectTab(int tab) {
        synchronized (Application.getEventLock()) {
            // Set Tab visible GUI
            if (tab == TAB1) {
                tab1.setFocus();
                tab1.setBgImage(imgTab1Focus);
                tab2.setBgImage(imgTab2Normal);
                tab1.selected = true;
                tab2.selected = false;
            } else if (tab == TAB2) {
                tab2.setFocus();
                tab1.setBgImage(imgTab1Normal);
                tab2.setBgImage(imgTab2Focus);
                tab1.selected = false;
                tab2.selected = true;
            }
        }
        currentState = tab;
        onNavigationClick(currentState);
    }

    public void deselectAllTab() {
        tab1.setBgImage(imgTab1Normal);
        tab2.setBgImage(imgTab2Normal);
        tab1.selected = false;
        tab2.selected = false;
    }

    public abstract void onNavigationClick(int selection);

    protected void sublayout(int maxWidth, int maxHeight) {
        super.sublayout(maxWidth, maxHeight);
        setExtent(Display.getWidth(), getPreferredHeight());
    }

    protected void paintBackground(Graphics gr) {
        // TODO Auto-generated method stub
        super.paintBackground(gr);
        gr.setColor(0x000000);
        gr.fillRect(0, 0, Display.getWidth(), getPreferredHeight());
    }

    private abstract class TopBarComponenet extends Field {

        private Bitmap bgImage;
        private String text;
        public boolean selected;
        private int width;
        private int height;

        public TopBarComponenet(final Bitmap bgImage) {
            super(FOCUSABLE);
            this.bgImage = bgImage;
            // this width depends on how many tab added.
            // for example if we want to add 5 tab then
            // width = Display.getWidth() / 5;
            width = Display.getWidth() / 2;
            height = bgImage.getHeight();
        }

        public void setBgImage(Bitmap image) {
            this.bgImage = image;
        }

        protected void drawFocus(Graphics graphics, boolean on) {
        }

        protected void layout(int width, int height) {
            setExtent(getPreferredWidth(), getPreferredHeight());
        }

        public int getPreferredHeight() {
            return height;
        }

        public int getPreferredWidth() {
            return width;
        }

        protected void paint(Graphics graphics) {
            graphics.drawBitmap((width - bgImage.getWidth()) / 2, 0,
                    bgImage.getWidth(), bgImage.getHeight(), bgImage, 0, 0);
            if (isFocus()) {
                graphics.setColor(0xffffff); // white
                graphics.setGlobalAlpha(50);
                graphics.fillRoundRect(0, 2, width, height - 4, 10, 10);
                graphics.setGlobalAlpha(255);
            }
        }

        protected void onFocus(int direction) {
            super.onFocus(direction);
            invalidate();
        }

        protected void onUnfocus() {
            super.onUnfocus();
            invalidate();
        }

        protected boolean keyDown(int keycode, int time) {
            char c = KeypadUtil.getKeyChar(keycode,
                    KeypadUtil.MODE_UI_CURRENT_LOCALE);
            if (c == '\n') {
                onClick();
            } else if (keycode == 13) {
                onClick();
            }
            return super.keyDown(keycode, time);
        }

        protected boolean navigationClick(int status, int time) {
            onClick();
            return true;
        }

        protected abstract void onClick();
    }
}
于 2012-08-03T12:46:08.437 に答える
0

Screen1.java

    package com.app;

        import net.rim.device.api.system.Application;
        import net.rim.device.api.system.Display;
        import net.rim.device.api.ui.UiApplication;
        import net.rim.device.api.ui.component.ButtonField;
        import net.rim.device.api.ui.container.MainScreen;
        import net.rim.device.api.ui.container.VerticalFieldManager;

        public class Screen1 extends MainScreen {
            private VerticalFieldManager mainManager;
            private NavigationMenuBar tabBar;
        private static Screen1 ref= null;

    public static Screen1 getInstance(){
        if(ref==null){
            ref = new Screen1();
        }
        return ref;
    }
            public Screen1() {
                tabBar = new NavigationMenuBar() {

                    public void onNavigationClick(int selection) {
                        if (NavigationMenuBar.TAB1 == selection) {

                        } else if (NavigationMenuBar.TAB2 == selection) {
                            // Push Screen Which is releted to second tab
                            synchronized (Application.getEventLock()) {
                                Screen2.getInstance().setSelectedTab(NavigationMenuBar.TAB2);
                        UiApplication.getUiApplication().pushScreen(
                                Screen2.getInstance());
                            }
                        }
                    }
                };
                tabBar.selectTab(NavigationMenuBar.TAB1);
                mainManager = new VerticalFieldManager() {
                    protected void sublayout(int maxWidth, int maxHeight) {
                        super.sublayout(maxWidth, maxHeight);
                        setExtent(getPreferredWidth(), getPreferredHeight());
                    }

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

                    public int getPreferredHeight() {
                        return Display.getHeight() - tabBar.getPreferredHeight();
                    }
                };
        //      setTitle("Screen one");
                mainManager.add(new ButtonField("Screen1"));

                add(mainManager);
                add(tabBar);
            }
public void setSelectedTab(int tabNumber) {
    tabBar.selectTab(tabNumber);
}
        }

SCreen2.java

 package com.app;

    import net.rim.device.api.system.Application;
    import net.rim.device.api.system.Display;
    import net.rim.device.api.ui.UiApplication;
    import net.rim.device.api.ui.component.ButtonField;
    import net.rim.device.api.ui.container.MainScreen;
    import net.rim.device.api.ui.container.VerticalFieldManager;

    public class Screen2 extends MainScreen {
        private VerticalFieldManager mainManager;
        private NavigationMenuBar tabBar;
    private static Screen2 ref= null;

    public static Screen2 getInstance(){
        if(ref==null){
            ref = new Screen2();
        }
        return ref;
    }
        public Screen2() {
            tabBar = new NavigationMenuBar() {

                public void onNavigationClick(int selection) {
                    if (NavigationMenuBar.TAB1 == selection) {
                        // Push Screen Which is releted to first tab
                        synchronized (Application.getEventLock()) {
                            Screen1.getInstance().setSelectedTab(NavigationMenuBar.TAB1);
                        UiApplication.getUiApplication().pushScreen(
                                Screen1.getInstance());
                        }
                    } else if (NavigationMenuBar.TAB2 == selection) {

                    }
                }
            };
            tabBar.selectTab(NavigationMenuBar.TAB2);
            mainManager = new VerticalFieldManager() {
                protected void sublayout(int maxWidth, int maxHeight) {
                    super.sublayout(maxWidth, maxHeight);
                    setExtent(getPreferredWidth(), getPreferredHeight());
                }

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

                public int getPreferredHeight() {
                    return Display.getHeight() - tabBar.getPreferredHeight();
                }
            };
    //      setTitle("Screen two");
            mainManager.add(new ButtonField("Screen2"));
            add(mainManager);
            add(tabBar);
        }
public void setSelectedTab(int tabNumber) {
    tabBar.selectTab(tabNumber);
}
    }

NAvigationMenuScreenでこれらの2行にコメントしてください

tab1.setFocus();

tab2.setFocus();

于 2012-08-07T08:43:44.163 に答える