Java 从gluon CharmListView切换视图在桌面上有效,但在Android中不起作用
所以我一直在做一个项目,我有一个CharmListView,其中填充了要使用的任务的名称。我可以通过我的登录屏幕登录,进入CharmListView并单击我想要打开的任务。当我测试它时,它会在桌面上打开,但在Android中它失败了,说找不到位置,并且:Java 从gluon CharmListView切换视图在桌面上有效,但在Android中不起作用,java,android,gluon,gluon-mobile,Java,Android,Gluon,Gluon Mobile,所以我一直在做一个项目,我有一个CharmListView,其中填充了要使用的任务的名称。我可以通过我的登录屏幕登录,进入CharmListView并单击我想要打开的任务。当我测试它时,它会在桌面上打开,但在Android中它失败了,说找不到位置,并且: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void com.glionhq.charm.glisten.mvc.View.setName(java.lang.String) 以下是我的魅力课程
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void com.glionhq.charm.glisten.mvc.View.setName(java.lang.String)
以下是我的魅力课程:
这一个本质上是任务模型
public class CharmHomeNavTask {
private String taskName;
private String taskDesc;
private static final Image IMAGE_ADMIN = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/admin.png"));
private static final Image IMAGE_AUDIT_TOOL = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/auditTool.png"));
private static final Image IMAGE_CONSOLIDATE_PACKAGE = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/consolidatePackage.png"));
private static final Image IMAGE_DISPOSAL = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/disposal.png"));
private static final Image IMAGE_EQUIP_MANGAGE = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/equipmentManagement.png"));
private static final Image IMAGE_INTRA_TRANSFER = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/intratransfer.png"));
private static final Image IMAGE_PICKUP = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/pickup.png"));
private static final Image IMAGE_TRU_WASTE_PREP = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/truWastePrep.png"));
private static final Image IMAGE_VISUAL_INSPECTION = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/visualInspection.png"));
private static final Image IMAGE_WALL2WALL = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/wall2wall.png"));
private static final Image IMAGE_WASTE_ID = new Image(WcatsAndroidDemo.class.getResourceAsStream("/gov/lanl/taskImages/wasteIdentification.png"));
private static Image[] listOfImages = {IMAGE_WASTE_ID, IMAGE_VISUAL_INSPECTION, IMAGE_TRU_WASTE_PREP, IMAGE_CONSOLIDATE_PACKAGE, IMAGE_INTRA_TRANSFER, IMAGE_PICKUP, IMAGE_DISPOSAL, IMAGE_ADMIN, IMAGE_WALL2WALL,
IMAGE_EQUIP_MANGAGE, IMAGE_AUDIT_TOOL };
public CharmHomeNavTask(String taskName, String taskDesc){
this.taskName = taskName;
this.taskDesc = taskDesc;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getTaskDesc() {
return taskDesc;
}
public void setTaskDesc(String taskDesc) {
this.taskDesc = taskDesc;
}
public static void setListOfImages(Image[] listOfImages) {
listOfImages = listOfImages;
}
public static Image[] getListOfImages(){
return listOfImages;
}
public static Image getSingleImageFromList(int index){
return listOfImages[index];
}
}
这是将任务创建为可观察列表
public class CharmHomeNavTasks {
public static ObservableList<CharmHomeNavTask> tasksList = FXCollections.observableArrayList(
new CharmHomeNavTask("Waste Identification", "Identify you waste from this screen."),
new CharmHomeNavTask("TRU Visual Inspection", "Visual Inspection of TRU waste."),
new CharmHomeNavTask("TRU Drum Preparation", "Prepare your TRU drums here."),
new CharmHomeNavTask("Consolidation/Packaging", "Consolidate and package your waste."),
new CharmHomeNavTask("Intra-Facility Transfer", "Transferring of waste within the same facility."),
new CharmHomeNavTask("Inter-Facility Pickup", "Picking up waste within the same facility."),
new CharmHomeNavTask("Disposal Tasks", "Disposal of waste tasks."),
new CharmHomeNavTask("Administrative Tasks", "Administrators have special tasks they can perform here."),
new CharmHomeNavTask("Wall-Wall Inventory", "Wall to Wall inventory tasks."),
new CharmHomeNavTask("Equipment Management", "Waste related equipment tasks."),
new CharmHomeNavTask("Audit Support Tool", "Tool for audit related tasks."));
public static ObservableList<CharmHomeNavTask> getTasksList() {
return tasksList;
}
}
public类CharmHomeNavTasks{
公共静态ObservableList tasksList=FXCollections.observableArrayList(
新建CharmHomeAvtask(“废物识别”,“从此屏幕识别您的废物”),
新CharmHomeNavTask(“TRU目视检查”、“TRU废物目视检查”),
新的CharmHomeNavTask(“TRU鼓准备”,“在这里准备您的TRU鼓”),
新的CharmHomeNavTask(“整合/包装”,“整合和包装您的废物”),
新CharmHomeNavTask(“设施内转移”、“同一设施内废物转移”),
新的CharmHomeNavTask(“设施间捡拾”、“在同一设施内捡拾废物”),
新CharmHomeNavTask(“处置任务”、“废物处置任务”),
新的CharmHomeAvtask(“管理任务”,“管理员可以在此处执行特殊任务”),
新的CharmHomeNavTask(“墙壁库存”、“墙壁到墙壁库存任务”),
新CharmHomeNavTask(“设备管理”、“废物相关设备任务”),
新的CharmHomeNavTask(“审计支持工具”、“审计相关任务工具”);
公共静态可观察列表getTasksList(){
返回任务列表;
}
}
这是一个给我带来麻烦的问题,因为我在这里有onMouseClicked事件,并且我将项目(或任务)设置为selected。这似乎在Android上也能正常工作,因为我可以通过系统告诉我点击了哪个项目
public class CharmHomeNavTaskCell extends CharmListCell<CharmHomeNavTask> {
private final ListTile tile;
private final ImageView imageView;
private CharmHomeNavTask item;
public CharmHomeNavTask carryOverItem;
public CharmHomeNavTaskCell(CharmListView listView){
tile = new ListTile();
imageView = new ImageView();
tile.setPrimaryGraphic(imageView);
carryOverItem = item;
tile.setOnMouseClicked(e -> {
System.out.println("******************* Item clicked " + item.getTaskName());
listView.setSelectedItem(item);
});
setText(null);
}
@Override
public void updateItem(CharmHomeNavTask item, boolean empty){
super.updateItem(item, empty);
this.item = item;
imageView.setFitWidth(32);
imageView.setFitHeight(32);
if (item != null && !empty) {
tile.textProperty().setAll(item.getTaskName() + " ", item.getTaskDesc());
tile.setWrapText(true);
final Image[] image = CharmHomeNavTask.getListOfImages();
super.setStyle("-fx-font-weight: bold");
switch (item.getTaskName()) {
case "Waste Identification":
imageView.setImage(image[0]);
break;
case "TRU Visual Inspection":
imageView.setImage(image[1]);
break;
case "TRU Drum Preparation":
imageView.setImage(image[2]);
break;
case "Consolidation/Packaging":
imageView.setImage(image[3]);
break;
case "Intra-Facility Transfer":
imageView.setImage(image[4]);
break;
case "Inter-Facility Pickup":
imageView.setImage(image[5]);
break;
case "Disposal Tasks":
imageView.setImage(image[6]);
break;
case "Administrative Tasks":
imageView.setImage(image[7]);
break;
case "Wall-Wall Inventory":
imageView.setImage(image[8]);
break;
case "Equipment Management":
imageView.setImage(image[9]);
break;
case "Audit Support Tool":
imageView.setImage(image[10]);
break;
}
setGraphic(tile);
} else {
setGraphic(null);
}
}
}
公共类CharmHomeAvtaskCell扩展了CharmListCell{
私人最终名单;
私人最终影像视图;
私有CharmHomeNavTask项;
公共CharmHomeNavTask carryovitem;
公共CharmHomeNavTaskCell(CharmListView列表视图){
tile=新列表tile();
imageView=新的imageView();
tile.setPrimaryGraphic(imageView);
结转检验=项目;
tile.setonMouseClacked(e->{
System.out.println(“****************Item单击”+Item.getTaskName());
listView.setSelectedItem(项目);
});
setText(空);
}
@凌驾
public void updateItem(CharmHomeAvTask项,布尔值为空){
super.updateItem(项,空);
this.item=项目;
imageView.setFitWidth(32);
imageView.setFitHeight(32);
如果(项!=null&&!空){
tile.textProperty().setAll(item.getTaskName()+“”,item.getTaskDesc());
tile.setWrapText(true);
最终图像[]图像=CharmHomeAvTask.getListOfImages();
super.setStyle(“-fx字体大小:粗体”);
开关(item.getTaskName()){
案例“废物识别”:
setImage(图像[0]);
打破
案例“TRU目视检查”:
setImage(图[1]);
打破
案例“TRU滚筒准备”:
setImage(图[2]);
打破
案例“合并/打包”:
setImage(图[3]);
打破
案例“贷款内转账”:
setImage(图[4]);
打破
案例“设施间取货”:
setImage(图[5]);
打破
案例“处置任务”:
setImage(图[6]);
打破
案例“行政任务”:
setImage(图[7]);
打破
案例“墙壁库存”:
setImage(图[8]);
打破
案例“设备管理”:
setImage(图[9]);
打破
案例“审计支持工具”:
setImage(图[10]);
打破
}
地砖;
}否则{
设置图形(空);
}
}
}
下面是AppViewManager类。我使用的是闪光和加力,只是为了让你们知道
public class AppViewManager {
private static String getLoggedInUser(User user){
if (user != null) {
return user.getId();
} else {
return "Not Logged In";
}
}
public static final AppViewRegistry REGISTRY = new AppViewRegistry();
public static final AppView PRIMARY_VIEW = view("Home", PrimaryPresenter.class, MaterialDesignIcon.HOME, SHOW_IN_DRAWER, HOME_VIEW);
public static final AppView SECONDARY_VIEW = view("Task List", SecondaryPresenter.class, MaterialDesignIcon.LIST, SHOW_IN_DRAWER);
public static final AppView SETTINGS_VIEW = view("Settings", SettingsView.class, MaterialDesignIcon.SETTINGS_APPLICATIONS, SHOW_IN_DRAWER);
public static final AppView INTRAFACILITYTRANSFER_VIEW = view("Intra-Facility Transfer", IntraFacilityView.class, MaterialDesignIcon.EDIT_LOCATION);
private static AppView view(String title, Class<? extends GluonPresenter<?>> presenterClass, MaterialDesignIcon menuIcon, AppView.Flag... flags ) {
return REGISTRY.createView(name(presenterClass), title, presenterClass, menuIcon, flags);
}
private static String name(Class<? extends GluonPresenter<?>> presenterClass) {
return presenterClass.getSimpleName().toUpperCase(Locale.ROOT).replace("PRESENTER", "");
}
public static void registerViewsAndDrawer(MobileApplication app) {
for (AppView view : REGISTRY.getViews()) {
view.registerView(app);
}
Image image = new Image(WcatsAndroidDemo.class.getResourceAsStream("/icon.png"));
NavigationDrawer.Header header = new NavigationDrawer.Header("\nWCATS" + "- " + getLoggedInUser(WcatsAndroidDemo.getInstance().getLoggedUser()),
"Waste Management System", new ImageView(image));
// TODO: Add a footer to the drawer that contains settings, help & feedback, and About
NavigationDrawer.Footer footer = new NavigationDrawer.Footer("No tasks currently need to be synchronized.", null);
//Create the sub items for the drawer
NavigationDrawer.Item about = new NavigationDrawer.Item("About", MaterialDesignIcon.INFO.graphic());
NavigationDrawer.Item logOut = new NavigationDrawer.Item("Logout", MaterialDesignIcon.EXIT_TO_APP.graphic());
// TODO: make the rest of the submenu items that go in the header.
DefaultDrawerManager drawerManager = new DefaultDrawerManager(app, header, REGISTRY.getViews()) {
{
NavigationDrawer drawer = getDrawer();
drawer.visibleProperty().addListener((observable, oldValue, newValue) -> {
if (newValue){
header.setTitle("\nWCATS - " + getLoggedInUser(WcatsAndroidDemo.getInstance().getLoggedUser()));
}
});
// Add items
drawer.setFooter(footer);
footer.setStyle("-fx-text-size: 6");
drawer.getItems().addAll(new Separator(), about, logOut, new Separator());
// TODO: provide action based on item selected
drawer.selectedItemProperty().addListener(((observable, oldValue, newValue) -> {
if(newValue.equals(about)) {
System.out.println("test");
} else if (newValue.equals(logOut)){
WcatsAndroidDemo.getInstance().userLogout();
} else if (newValue.equals(SECONDARY_VIEW.getMenuItem())){
if (getLoggedInUser(WcatsAndroidDemo.getInstance().getLoggedUser()).equals("Not Logged In")) {
AppViewManager.PRIMARY_VIEW.switchView();
} else {
AppViewManager.SECONDARY_VIEW.switchView();
}
}
} ));
}
};
drawerManager.installDrawer();
}
}
公共类AppViewManager{
私有静态字符串getLoggedInUser(用户){
如果(用户!=null){
返回user.getId();
}否则{
返回“未登录”;
}
}
公共静态最终AppViewRegistry注册表=新AppViewRegistry();
public static final AppView PRIMARY\u VIEW=视图(“Home”,PRIMARY presenter.class,MaterialDesignIcon.Home,在抽屉中显示,Home\u视图);
public static final AppView SECONDARY\u VIEW=VIEW(“任务列表”,SECONDARY presenter.class,MaterialDesignIcon.List,在抽屉中显示);
公共静态最终应用程序视图设置\u视图=视图(“设置”,设置视图.class,材质设计.SETTINGS\u应用程序,在抽屉中显示);
公共静态最终应用程序视图设施内传输视图=视图(“设施内传输”,设施内视图.class,物料设计.编辑位置);
私有静态AppView视图(字符串标题,类>presenterClass,MaterialDesignIcon菜单,AppView.Flag…标志){
返回REGISTRY.createView(名称(presenterClass)、标题、presenterClass、菜单项、标志);
}
私有静态字符串名称(类>presenterClass){
返回presenterClass.getSimpleName().toUpperCase(Locale.ROOT)。替换(“PRESENTER”,“PRESENTER”);
}
public class SecondaryPresenter extends GluonPresenter<WcatsAndroidDemo> {
@FXML
private View homeView;
@FXML
public CharmListView<CharmHomeNavTask, Integer> charmListView;
public void initialize() {
homeView.setShowTransitionFactory(BounceInRightTransition::new);
AppBar appBar = getApp().getAppBar();
homeView.showingProperty().addListener((observable, oldValue, newValue) -> {
appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApp().showLayer(DRAWER_LAYER)));
appBar.setTitleText("Task Selection");
});
charmListView.setFloatingHeaderVisible(false);
charmListView.setItems(CharmHomeNavTasks.getTasksList());
charmListView.setCellFactory(param -> new CharmHomeNavTaskCell(charmListView));
charmListView.selectedItemProperty().addListener((observable, oldValue, newValue) -> {
if (newValue.getTaskName().equals("Intra-Facility Transfer")){
AppViewManager.INTRAFACILITYTRANSFER_VIEW.switchView(ViewStackPolicy.SKIP);
}
});
}
}
public class IntraFacilityView extends GluonPresenter<WcatsAndroidDemo> {
@FXML
public ChoiceBox facilityCMBox;
@FXML
public ChoiceBox storageUnitOrgCMBox;
@FXML
public ChoiceBox storageUnitDestCMBox;
@FXML
public ChoiceBox gridXCMBox;
@FXML
public ChoiceBox gridYCMBox;
@FXML
public ChoiceBox gridZCMBox;
@FXML
public CheckBox organizeUnitCHKBox;
@FXML
public Button viewMoreReqsBTN;
@FXML
public Button viewPendingMovesBTN;
@FXML
public Button resumeTaskBTN;
@FXML
private View intrafacility;
public void initialize(){
intrafacility.setShowTransitionFactory(BounceInRightTransition::new);
intrafacility.showingProperty().addListener((observable, oldValue, newValue) -> {
if (newValue) {
AppBar appBar = getApp().getAppBar();
appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> {
getApp().showLayer(DRAWER_LAYER);
}));
appBar.setTitleText("Intra-Facility Transfer");
appBar.getActionItems().add(MaterialDesignIcon.CLOSE.button(e -> {
AppViewManager.SECONDARY_VIEW.switchView();
}));
}
});
}
public void handleOrganizeUnitsCHKBox(ActionEvent actionEvent) {
}
public void handleViewMoreReqs(ActionEvent actionEvent) {
}
public void handleResumeTask(ActionEvent actionEvent) {
}
public void handlevVewPendingMoves(ActionEvent actionEvent) {
}
}