我正在使用Codenameone(在Intellij中)的IOS应用程序,并编写了一个界面供用户在我的应用程序中使用谷歌地图。然而,当他们开始搜索地点或在街景中导航时,我在iOS模拟器上收到了大量的乱码(见下面的截图)。有没有人遇到过这个问题,如果有的话,你找到了如图所示吗?
public class PetBnBApp {
private static final String HTML_API_KEY = "AIzaSyBWeRU02YUYPdwRuMFyTKIXUbHjq6e35Gw";
private Form current;
private Resources theme;
private Form home;
public void init(Object context) {
theme = UIManager.initFirstTheme("/theme");
// Enable Toolbar on all Forms by default
Toolbar.setGlobalToolbar(true);
// Pro only feature
try {
Resources theme = Resources.openLayered("/theme");
UIManager.getInstance().setThemeProps(theme.getTheme(theme.getThemeResourceNames()[0]));
Display.getInstance().setCommandBehavior(Display.COMMAND_BEHAVIOR_SIDE_NAVIGATION);
UIManager.getInstance().getLookAndFeel().setMenuBarClass(SideMenuBar.class);
} catch (IOException e) {
e.printStackTrace();
}
}
MapContainer.MapObject sydney;
public void start() {
if (current != null) {
current.show();
return;
}
Form maps = new Form("Native Maps Test");
maps.setLayout(new BorderLayout());
final MapContainer cnt = new MapContainer(HTML_API_KEY);
//final MapContainer cnt = new MapContainer();
//42.3040009,-71.5040407
cnt.setCameraPosition(new Coord(42.3040009, -71.5040407));//this breaks the code //because the Google map is not loaded yet
cnt.addMapListener(new MapListener() {
@Override
public void mapPositionUpdated(Component source, int zoom, Coord center) {
System.out.println("Map position updated: zoom="+zoom+", Center="+center);
}
});
cnt.addLongPressListener(e->{
System.out.println("Long press");
ToastBar.showMessage("Received longPress at "+e.getX()+", "+e.getY(), FontImage.MATERIAL_3D_ROTATION);
});
cnt.addTapListener(e->{
ToastBar.showMessage("Received tap at "+e.getX()+", "+e.getY(), FontImage.MATERIAL_3D_ROTATION);
});
int maxZoom = cnt.getMaxZoom();
System.out.println("Max zoom is "+maxZoom);
Button btnMoveCamera = new Button("Move Camera");
btnMoveCamera.addActionListener(e->{
cnt.setCameraPosition(new Coord(-33.867, 151.206));
});
Style s = new Style();
s.setFgColor(0xff0000);
s.setBgTransparency(0);
FontImage markerImg = FontImage.createMaterial(FontImage.MATERIAL_PLACE, s, 3);
Button btnAddMarker = new Button("Add Marker");
btnAddMarker.addActionListener(e->{
cnt.setCameraPosition(new Coord(41.889, -87.622));
cnt.addMarker(EncodedImage.createFromImage(markerImg, false), cnt.getCameraPosition(), "Hi marker", "Optional long description", new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Bounding box is "+cnt.getBoundingBox());
ToastBar.showMessage("You clicked the marker", FontImage.MATERIAL_PLACE);
}
});
});
Button btnAddPath = new Button("Add Path");
btnAddPath.addActionListener(e->{
cnt.addPath(
cnt.getCameraPosition(),
new Coord(-33.866, 151.195), // Sydney
new Coord(-18.142, 178.431), // Fiji
new Coord(21.291, -157.821), // Hawaii
new Coord(37.423, -122.091) // Mountain View
);
});
Button panTo = new Button("Pan To");
panTo.addActionListener(e->{
//bounds.extend(new google.maps.LatLng('66.057878', '-22.579047')); // Iceland
//bounds.extend(new google.maps.LatLng('37.961952', '43.878878')); // Turkey
Coord c1 = new Coord(42.3040432, -71.5045936);
Coord c2 = new Coord(49.2577142, -123.1941149);
//Coord center = new Coord(c1.getLatitude()/2 + c2.getLatitude() / 2, c1.getLongitude()/2 + c2.getLongitude()/2 );
Coord center = new Coord(49.1110928, -122.9414646);
float zoom = cnt.getZoom();
boolean[] finished = new boolean[1];
cnt.addMapListener(new MapListener() {
@Override
public void mapPositionUpdated(Component source, int zoom, Coord c) {
if (Math.abs(c.getLatitude() - center.getLatitude()) > .001 || Math.abs(c.getLongitude() - center.getLongitude()) > .001) {
return;
}
finished[0] = true;
synchronized(finished) {
final MapListener fthis = this;
Display.getInstance().callSerially(()->{
cnt.removeMapListener(fthis);
});
finished.notify();
}
}
});
cnt.zoom(center, (int)zoom);
while (!finished[0]) {
Display.getInstance().invokeAndBlock(()->{
while (!finished[0]) {
Util.wait(finished, 100);
}
});
}
BoundingBox box = cnt.getBoundingBox();
if (!box.contains(c1) || !box.contains(c2)) {
while (!box.contains(c1) || !box.contains(c2)) {
if (!box.contains(c1)) {
System.out.println("Box "+box+" doesn't contain "+c1);
}
if (!box.contains(c1)) {
System.out.println("Box "+box+" doesn't contain "+c2);
}
zoom -= 1;
final boolean[] done = new boolean[1];
final int fzoom = (int)zoom;
cnt.addMapListener(new MapListener() {
@Override
public void mapPositionUpdated(Component source, int zm, Coord center) {
if (zm == fzoom) {
final MapListener fthis = this;
Display.getInstance().callSerially(()->{
cnt.removeMapListener(fthis);
});
done[0] = true;
synchronized(done) {
done.notify();
}
}
}
});
cnt.zoom(center, (int)zoom);
while (!done[0]) {
Display.getInstance().invokeAndBlock(()->{
while (!done[0]) {
Util.wait(done, 100);
}
});
}
box = cnt.getBoundingBox();
System.out.println("Zoom now "+zoom);
}
} else if (box.contains(c1) && box.contains(c2)) {
while (box.contains(c1) && box.contains(c2)) {
zoom += 1;
final boolean[] done = new boolean[1];
final int fzoom = (int)zoom;
cnt.addMapListener(new MapListener() {
public void mapPositionUpdated(Component source, int zm, Coord center) {
if (zm == fzoom) {
final MapListener fthis = this;
Display.getInstance().callSerially(()->{
cnt.removeMapListener(fthis);
});
done[0] = true;
synchronized(done) {
done.notify();
}
}
}
});
cnt.zoom(center, (int)zoom);
while (!done[0]) {
Display.getInstance().invokeAndBlock(()->{
while (!done[0]) {
Util.wait(done, 100);
}
});
}
box = cnt.getBoundingBox();
}
zoom -= 1;
cnt.zoom(center, (int)zoom);
cnt.addTapListener(null);
}
});
Button testCoordPositions = $(new Button("Test Coords"))
.addActionListener(e->{
Coord topLeft = cnt.getCoordAtPosition(0, 0);
System.out.println("Top Left is "+topLeft+" -> "+cnt.getScreenCoordinate(topLeft) +" Should be (0,0)");
Coord bottomRight = cnt.getCoordAtPosition(cnt.getWidth(), cnt.getHeight());
System.out.println("Bottom right is "+bottomRight+" -> "+cnt.getScreenCoordinate(bottomRight) + " Should be "+cnt.getWidth()+", "+cnt.getHeight());
Coord bottomLeft = cnt.getCoordAtPosition(0, cnt.getHeight());
System.out.println("Bottom Left is "+bottomLeft+" -> "+cnt.getScreenCoordinate(bottomLeft) + " Should be 0, "+cnt.getHeight());
Coord topRight = cnt.getCoordAtPosition(cnt.getWidth(), 0);
System.out.println("Top right is "+topRight + " -> "+cnt.getScreenCoordinate(topRight)+ " Should be "+cnt.getWidth()+", 0");
Coord center = cnt.getCoordAtPosition(cnt.getWidth()/2, cnt.getHeight()/2);
System.out.println("Center is "+center+" -> "+cnt.getScreenCoordinate(center)+", should be "+(cnt.getWidth()/2)+", "+(cnt.getHeight()/2));
EncodedImage encImg = EncodedImage.createFromImage(markerImg, false);
cnt.addMarker(encImg, topLeft,"Top Left", "Top Left", null);
cnt.addMarker(encImg, topRight, "Top Right", "Top Right", null);
cnt.addMarker(encImg, bottomRight, "Bottom Right", "Bottom Right", null);
cnt.addMarker(encImg, bottomLeft, "Bottom Left", "Bottom Left", null);
cnt.addMarker(encImg, center, "Center", "Center", null);
})
.asComponent(Button.class);
Button toggleTopMargin = $(new Button("Toggle Margin"))
.addActionListener(e->{
int marginTop = $(cnt).getStyle().getMarginTop();
if (marginTop < Display.getInstance().getDisplayHeight() / 3) {
$(cnt).selectAllStyles().setMargin(Display.getInstance().getDisplayHeight() / 3, 0, 0, 0);
} else {
$(cnt).selectAllStyles().setMargin(0,0,0,0);
}
$(cnt).getComponentForm().revalidate();
})
.asComponent(Button.class);
Button btnClearAll = new Button("Clear All");
btnClearAll.addActionListener(e->{
cnt.clearMapLayers();
});
MapContainer.MapObject mo = cnt.addMarker(EncodedImage.createFromImage(markerImg, false), new Coord(-33.866, 151.195), "test", "test", e->{
System.out.println("Marker clicked");
cnt.removeMapObject(sydney);
});
sydney = mo;
System.out.println("MO is "+mo);
mo = cnt.addMarker(EncodedImage.createFromImage(markerImg, false), new Coord(-18.142, 178.431), "test", "test",e->{
System.out.println("Marker clicked");
});
System.out.println("MO is "+mo);
cnt.addTapListener(e->{
if (tapDisabled) {
return;
}
tapDisabled = true;
TextField enterName = new TextField();
Container wrapper = BoxLayout.encloseY(new Label("Name:"), enterName);
InteractionDialog dlg = new InteractionDialog("Add Marker");
dlg.getContentPane().add(wrapper);
enterName.setDoneListener(e2->{
String txt = enterName.getText();
cnt.addMarker(EncodedImage.createFromImage(markerImg, false), cnt.getCoordAtPosition(e.getX(), e.getY()), enterName.getText(), "", e3->{
ToastBar.showMessage("You clicked "+txt, FontImage.MATERIAL_PLACE);
});
dlg.dispose();
tapDisabled = false;
});
dlg.showPopupDialog(new Rectangle(e.getX(), e.getY(), 10, 100));
enterName.startEditingAsync();
});
Button showNextForm = $(new Button("Next Form"))
.addActionListener(e->{
Form form = new Form("Hello World");
Button b1 = $(new Button("B1"))
.addActionListener(e2->{
ToastBar.showMessage("B1 was pressed", FontImage.MATERIAL_3D_ROTATION);
})
.asComponent(Button.class);
Button back = $(new Button("Back to Home"))
.addActionListener(e2->{
home.showBack();
})
.asComponent(Button.class);
form.add(b1);
})
.asComponent(Button.class);
FloatingActionButton nextForm = FloatingActionButton.createFAB(FontImage.MATERIAL_ACCESS_ALARM);
nextForm.addActionListener(e->{
Form form = new Form("Hello World");
Button b1 = $(new Button("B1"))
.addActionListener(e2->{
ToastBar.showMessage("B1 was pressed", FontImage.MATERIAL_3D_ROTATION);
})
.asComponent(Button.class);
Button back = $(new Button("Back to Home"))
.addActionListener(e2->{
home.showBack();
})
.asComponent(Button.class);
form.add(b1).add(back);
form.show();
});
Container root = LayeredLayout.encloseIn(
BorderLayout.center(nextForm.bindFabToContainer(cnt)),
BorderLayout.south(
FlowLayout.encloseBottom(panTo, testCoordPositions, toggleTopMargin, btnMoveCamera, btnAddMarker, btnAddPath, btnClearAll )
)
);
maps.add(BorderLayout.CENTER, root);
maps.show();
Form hi = new Form("Native Maps Test");
hi.setLayout(new BorderLayout());
System.out.println("Read...");
ReadParseJson x = new ReadParseJson();
GoogleMapsTestApp e = new GoogleMapsTestApp();
System.out.println(Arrays.toString(x.getArray()));
//create and build the home Form
home = new Form("Home", BoxLayout.y());
home.add(new Label("PetBnB: AirBnB for Pets!"));
home.add(new Button("Search for Local Stay"));
home.add(new Button("Payment"));
TextField txt = new TextField("", "Enter Pet Animal here:");
home.add(txt)
.add(new CheckBox("New Users in Your Area!"));
RadioButton rb1 = new RadioButton("Bnb Area 2");
RadioButton rb2 = new RadioButton("Bnb Area 3");
rb1.setGroup("group");
rb2.setGroup("group");
home.addAll(rb1, rb2);
final Slider a = new Slider();
a.setText("50$");
a.setProgress(50);
a.setEditable(true);
a.setRenderPercentageOnTop(true);
home.add(a);
Button b1 = new Button("WARNING: MUST READ");
b1.addActionListener(evt -> Dialog.show("Warning!", "If Pet dies, it is not Bnb owner's responsibility", "Ok", "Cancel"));
home.add(b1);
//Create Form1 and Form2 and set a Back Command to navigate back to the home Form
Form form1 = new Form("Search For Stay");
setBackCommand(form1);
Form form2 = new Form("Help");
setBackCommand(form2);
//Add navigation commands to the home Form
NavigationCommand homeCommand = new NavigationCommand("Home");
homeCommand.setNextForm(home);
home.getToolbar().addCommandToSideMenu(homeCommand);
NavigationCommand cmd1 = new NavigationCommand("Search For Stay");
cmd1.setNextForm(maps);
home.getToolbar().addCommandToSideMenu(cmd1);
NavigationCommand cmd2 = new NavigationCommand("Help");
cmd2.setNextForm(form2);
home.getToolbar().addCommandToSideMenu(cmd2);
//Add Edit, Add and Delete Commands to the home Form context Menu
Image im = FontImage.createMaterial(FontImage.MATERIAL_MODE_EDIT, UIManager.getInstance().getComponentStyle("Command"));
Command edit = new Command("Edit", im) {
@Override
public void actionPerformed(ActionEvent evt) {
System.out.println("Editing");
}
};
home.getToolbar().addCommandToOverflowMenu(edit);
im = FontImage.createMaterial(FontImage.MATERIAL_LIBRARY_ADD, UIManager.getInstance().getComponentStyle("Command"));
Command add = new Command("Add", im) {
@Override
public void actionPerformed(ActionEvent evt) {
System.out.println("Adding");
}
};
home.getToolbar().addCommandToOverflowMenu(add);
im = FontImage.createMaterial(FontImage.MATERIAL_DELETE, UIManager.getInstance().getComponentStyle("Command"));
Command delete = new Command("Delete", im) {
@Override
public void actionPerformed(ActionEvent evt) {
System.out.println("Deleting");
}
};
home.getToolbar().addCommandToOverflowMenu(delete);
home.show();
}
protected void setBackCommand(Form f) {
Command back = new Command("") {
@Override
public void actionPerformed(ActionEvent evt) {
home.showBack();
}
};
Image img = FontImage.createMaterial(FontImage.MATERIAL_ARROW_BACK, UIManager.getInstance().getComponentStyle("TitleCommand"));
back.setIcon(img);
f.getToolbar().addCommandToLeftBar(back);
f.getToolbar().setTitleCentered(true);
f.setBackCommand(back);
}
boolean tapDisabled = false;
public void stop() {
current = Display.getInstance().getCurrent();
}
public void destroy() {
}
}