【问题标题】:Blackberry Tab bar control黑莓标签栏控件
【发布时间】:2012-04-16 21:47:16
【问题描述】:

我想在我的应用程序中添加一个标签栏。我在黑莓中尝试了它的示例代码,但我希望它位于屏幕底部。我尝试了此代码,但它给了我未捕获的运行时异常。为什么会这样?这段代码有什么问题?

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.image.*;
import net.rim.device.api.ui.toolbar.*;
import net.rim.device.api.util.*;
import net.rim.device.api.system.*;
import net.rim.device.api.command.*;

public class ToolbarDemo extends UiApplication
{
    public static void main(String[] args)
    {

        ToolbarDemo theApp = new ToolbarDemo();       
        theApp.enterEventDispatcher();
    }

    public ToolbarDemo()
    {        
        // Push a screen onto the UI stack for rendering.
        pushScreen(new ToolbarDemoScreen());
    }

    private final static class ToolbarDemoScreen extends MainScreen
    {
        public ToolbarDemoScreen()
        {              
            if (ToolbarManager.isToolbarSupported()) 
            {
                setTitle("Toolbar Demo");

                ToolbarManager manager = new ToolbarManager();
                setToolbar(manager);

                try 
                {
                    Bitmap myBitmap = Bitmap.getBitmapResource("myImg.jpg");
                    Image myImage = ImageFactory.createImage(myBitmap);

                    /*
                     * To create more buttons, Repeat the following lines 
                     * up until manager.add() 
                     */
                    ToolbarButtonField button1 = new ToolbarButtonField(myImage, new StringProvider("butn1"));
                    button1.setCommandContext(new Object()
                    {
                        public String toString()
                        {
                            return "Button1"; 
                        }          
                    });

                    button1.setCommand(new Command(new CommandHandler()
                    {         
                        public void execute(ReadOnlyCommandMetadata metadata, Object context)
                        {
                            Dialog.alert("Executing command for " + context.toString());
                        }           
                    }));

                    manager.add(new ToolbarSpacer(0));
                    manager.add(button1);
                }
                catch (Exception e)
                {
                    System.out.println(e.getMessage());
                }
            } 
            else 
            {
                Dialog.alert("The Toolbar is not supported on this device.");
            }
        }     
    }
}

【问题讨论】:

标签: blackberry


【解决方案1】:

如果您收到异常,Uncaught Exception: pushModalScreen called by a non-event thread,那么您可以尝试使用以下代码 sn-p 来显示警报。

UiApplication.getUiApplication().invokeLater(new Runnable() {
    public void run() {
        Dialog.alert("The Toolbar is not supported on this device.");
    }
});

请检查这个问题,“pushModalScreen called by a non-event thread” thrown on event thread

【讨论】:

    【解决方案2】:

    试试这个代码

    EncodedImage e1 = EncodedImage.getEncodedImageResource("home.png");
    EncodedImage e2 = EncodedImage.getEncodedImageResource("map.png");
    EncodedImage e3 = EncodedImage.getEncodedImageResource("members.png");
    EncodedImage e4 = EncodedImage.getEncodedImageResource("message.png");
    EncodedImage e5 = EncodedImage.getEncodedImageResource("settings.png");
    EncodedImage e6 = EncodedImage.getEncodedImageResource("logout.png");
    
    
    HorizontalFieldManager buttonPanel = new HorizontalFieldManager(Field.FIELD_TOP | Field.USE_ALL_WIDTH);
    
      VerticalFieldManager vfm=new VerticalFieldManager();
      vfm.add(new LabelField("Map"));
      vfm.add(new BitmapField(e2.getBitmap(),FOCUSABLE){
         protected boolean navigationClick(int status, int time){
    
            Dialog.alert("MAP");
            return true;
           }
    
      });
      buttonPanel.add(vfm);
      buttonPanel.add(new LabelField("  "));
    
      VerticalFieldManager vfm1=new VerticalFieldManager();
      vfm1.add(new LabelField("Members"));
      vfm1.add(new BitmapField(e3.getBitmap(),FOCUSABLE){
         protected boolean navigationClick(int status, int time){
    
            Dialog.alert("Members");
            return true;
           }
    
      });
      buttonPanel.add(vfm1);
    
      VerticalFieldManager vfm2=new VerticalFieldManager();
      vfm2.add(new LabelField("Message"));
      vfm2.add(new BitmapField(e4.getBitmap(),FOCUSABLE){
         protected boolean navigationClick(int status, int time){
    
            Dialog.alert("Message");
            return true;
           }
    
      });
      buttonPanel.add(vfm2);
    
      VerticalFieldManager vfm3=new VerticalFieldManager();
      vfm3.add(new LabelField("Settings"));
      vfm3.add(new BitmapField(e5.getBitmap(),FOCUSABLE){
         protected boolean navigationClick(int status, int time){
    
            Dialog.alert("Settings");
            return true;
           }
    
      });
      buttonPanel.add(vfm3);
    
      VerticalFieldManager vfm4=new VerticalFieldManager();
      vfm4.add(new LabelField("Logout"));
      vfm4.add(new BitmapField(e6.getBitmap(),FOCUSABLE){
         protected boolean navigationClick(int status, int time){
    
            Dialog.alert("Logout");
            return true;
           }
    
      });
      buttonPanel.add(vfm4);
    
      setStatus(buttonPanel);
    

    【讨论】:

    • 谢谢它的工作。但是如何改变它的大小。因为标签栏中的两个组件之间应该有分隔。我在标签栏中只有 3 个元素
    • 使用 vfm.setMargin 来安排宽度。
    • 对不起。我昨天做了一个小改动,为什么它不起作用?它现在可以工作了。但它看起来不像标签栏。如何设置背景使其看起来像标签栏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多