2012-12-17 61 views
2

我正在開發黑莓應用程序,我是一個新手,所以不知道如何實現。黑莓中的選項卡

在我的應用程序中,我必須實現選項卡。爲此,我使用了pillButtonSet。在我的應用程序中,我有五個標籤,每個標籤都有複雜的視圖。我想爲不同的選項卡創建不同的java類。

Android we have TabActivity一樣,我們可以輕鬆地在選項卡之間導航。我仍然沒有爲每個標籤設計視圖。我用谷歌搜索,但沒有成功。

我很擔心;我是否需要在一個屏幕上編寫完整的代碼? ....如果不是我要在哪裏創建選項卡以及如何導航?

回答

0

看看this BlackBerry example from RIM。這有點舊,但如果你仍然需要支持OS 5.0,這是一個有用的技術(如果你不支持OS 5.0,請參閱答案的底部)。

從描述:

的基本方法是使用一組管理來控制的,當已經選擇了選項卡上的屏幕出現 字段集。選項卡 實現爲可調焦LabelField,FocusChangeListener 在焦點更改時執行Manager開關。字段和管理器是 初始化一次並保留在內存中以保留選項卡之間的狀態更改 。

頁有示例代碼下載,但要防止任何可能的環節腐,這裏的樣品中最重要的部分:

package com.rim.samples.tabcontrol; 

import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.FocusChangeListener; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.BasicEditField; 
import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.component.SeparatorField; 
import net.rim.device.api.ui.container.HorizontalFieldManager; 
import net.rim.device.api.ui.container.MainScreen; 
import net.rim.device.api.ui.container.VerticalFieldManager; 

public class TabControl extends UiApplication { 

     public TabControl() { 
       TabControlScreen screen = new TabControlScreen(); 
       pushScreen(screen); 
     } 

     /** 
     * @param args 
     */ 
     public static void main(String[] args) { 
       TabControl app = new TabControl(); 
       app.enterEventDispatcher(); 
     } 

     private class TabControlScreen extends MainScreen implements FocusChangeListener { 

       private LabelField tab1; 
       private LabelField tab2;  
       private LabelField tab3; 
       private LabelField spacer1; 
       private LabelField spacer2;  
       private VerticalFieldManager tabArea;  
       private LabelField tab1Heading;  
       private BasicEditField tab1Field1;  
       private BasicEditField tab1Field2;  
       private LabelField tab2Heading;  
       private BasicEditField tab2Field1;  
       private BasicEditField tab2Field2;  
       private LabelField tab3Heading;  
       private BasicEditField tab3Field1;  
       private BasicEditField tab3Field2; 

       private VerticalFieldManager tab1Manager; 
       private VerticalFieldManager tab2Manager; 
       private VerticalFieldManager tab3Manager; 


       public TabControlScreen() { 
         HorizontalFieldManager hManager = new HorizontalFieldManager(); 
         tab1 = new LabelField("Page 1", LabelField.FOCUSABLE); 
         tab2 = new LabelField("Page 2", LabelField.FOCUSABLE); 
         tab3 = new LabelField("Page 3", LabelField.FOCUSABLE); 
         spacer1 = new LabelField(" | ", LabelField.NON_FOCUSABLE); 
         spacer2 = new LabelField(" | ", LabelField.NON_FOCUSABLE); 

         tab1.setFocusListener(this); 
         tab2.setFocusListener(this); 
         tab3.setFocusListener(this); 
         hManager.add(tab1); 
         hManager.add(spacer1); 
         hManager.add(tab2); 
         hManager.add(spacer2); 
         hManager.add(tab3); 

         add(hManager); 
         add(new SeparatorField()); 

         tab1Manager = new VerticalFieldManager(); 
         tab2Manager = new VerticalFieldManager(); 
         tab3Manager = new VerticalFieldManager(); 

         tabArea = displayTab1(); 
         add(tabArea); 

       } 

       public void focusChanged(Field field, int eventType) { 
         if (tabArea != null) { 
           if (eventType == FOCUS_GAINED) { 
             if (field == tab1) { 
               System.out.println("Switch to Tab 1"); 
               delete(tabArea); 
               tabArea = displayTab1(); 
               add(tabArea); 
             } else if (field == tab2) { 
               System.out.println("Switch to Tab 2"); 
               System.out.println("Switch to Tab 1"); 
               delete(tabArea); 
               tabArea = displayTab2(); 
               add(tabArea); 
             } else if (field == tab3) { 
               System.out.println("Switch to Tab 3"); 
               System.out.println("Switch to Tab 1"); 
               delete(tabArea); 
               tabArea = displayTab3(); 
               add(tabArea); 
             } 
           } 
         } 

       } 

       public VerticalFieldManager displayTab1() { 
         if (tab1Heading == null) { 
           tab1Heading = new LabelField("Registration"); 
           tab1Manager.add(tab1Heading); 
         } 
         if (tab1Field1 == null) { 
           tab1Field1 = new BasicEditField("Username: ", ""); 
           tab1Manager.add(tab1Field1); 
         } 
         if (tab1Field2 == null) { 
           tab1Field2 = new BasicEditField("Password: ", ""); 
           tab1Manager.add(tab1Field2); 
         } 
         return tab1Manager; 
       } 

       public VerticalFieldManager displayTab2() { 
         if (tab2Heading == null) { 
           tab2Heading = new LabelField("Password Recovery"); 
           tab2Manager.add(tab2Heading); 
         } 
         if (tab2Field1 == null) { 
           tab2Field1 = new BasicEditField("Security Question: ", "Mother's Maiden Name?"); 
           tab2Manager.add(tab2Field1); 
         } 
         if (tab2Field2 == null) { 
           tab2Field2 = new BasicEditField("Password: ", ""); 
           tab2Manager.add(tab2Field2); 
         } 
         return tab2Manager; 
       } 

       public VerticalFieldManager displayTab3() { 
         if (tab3Heading == null) { 
           tab3Heading = new LabelField("Interests"); 
           tab3Manager.add(tab3Heading); 
         } 
         if (tab3Field1 == null) { 
           tab3Field1 = new BasicEditField("Hobbies: ", ""); 
           tab3Manager.add(tab3Field1); 
         } 
         if (tab3Field2 == null) { 
           tab3Field2 = new BasicEditField("Memberships: ", ""); 
           tab3Manager.add(tab3Field2); 
         } 
         return tab3Manager; 
       } 

     } 

} 

你說:

我想爲不同的選項卡創建不同的java類。

在你的代碼,你可以編輯名爲displayTab1()displayTab2(),等返回不同的類爲每個標籤的方法。正如下面的例子,每個班級將extendVerticalFieldManager類。但是,如果對VerticalFieldManager的設置沒有很好的設置,那麼您肯定可以將這些方法的返回值更改爲Manager基類,而不是。

只記得改變tabArea成員變量,如果你做到這一點:

 private Manager tabArea;  

注:如果你只需要支持OS 6.0及以上版本,你也可以看看this newer API

+0

感謝。是的,我也嘗試過這種方式。你能告訴我如何使用displayTab1()推送和彈出java類。在displayTab1我必須整合Facebook和Twitter。我是否需要爲所有模型或特定的黑莓模型設計應用程序? – soft

+0

@soft,示例顯示了這一點。本身不需要*推*和* pop *。 'focusChanged()'方法顯示瞭如何決定何時調用displayTab1()或displayTab2()。然後它使用這些方法的結果'將Manager添加到現有的屏幕。您希望支持哪些BlackBerry型號是您的選擇。許多應用程序僅針對最受歡迎的型號發佈,但這是您必須決定的。以上代碼適用於所有BlackBerry Java智能手機。 – Nate

+0

thans我有你的觀點。還有一點,圖像切片的大小將根據選定的特定黑莓模型。 – soft