看看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()
,等返回不同的類爲每個標籤的方法。正如下面的例子,每個班級將extend
VerticalFieldManager
類。但是,如果對VerticalFieldManager
的設置沒有很好的設置,那麼您肯定可以將這些方法的返回值更改爲Manager
基類,而不是。
只記得改變tabArea
成員變量,如果你做到這一點:
private Manager tabArea;
注:如果你只需要支持OS 6.0及以上版本,你也可以看看this newer API
感謝。是的,我也嘗試過這種方式。你能告訴我如何使用displayTab1()推送和彈出java類。在displayTab1我必須整合Facebook和Twitter。我是否需要爲所有模型或特定的黑莓模型設計應用程序? – soft
@soft,示例顯示了這一點。本身不需要*推*和* pop *。 'focusChanged()'方法顯示瞭如何決定何時調用displayTab1()或displayTab2()。然後它使用這些方法的結果'將Manager添加到現有的屏幕。您希望支持哪些BlackBerry型號是您的選擇。許多應用程序僅針對最受歡迎的型號發佈,但這是您必須決定的。以上代碼適用於所有BlackBerry Java智能手機。 – Nate
thans我有你的觀點。還有一點,圖像切片的大小將根據選定的特定黑莓模型。 – soft