如何以与Android本机控件等效的Xamarin形式呈现UI控件?
我计划将Phunware地图集成到Xamarin表单应用程序中。我能够创建Android绑定项目,这样我就可以得到相当于Phunware Android原生SDK的软件包。通过这个,我可以访问Phunware SDK的所有方法和类。现在的挑战是,我必须遵循Phunware Android本机示例应用程序源代码,以Xamarin形式编写等效代码,并带来地图。我已经为示例提供了AndroidUIXML和活动文件如何以与Android本机控件等效的Xamarin形式呈现UI控件?,android,xamarin.forms,binding,Android,Xamarin.forms,Binding,我计划将Phunware地图集成到Xamarin表单应用程序中。我能够创建Android绑定项目,这样我就可以得到相当于Phunware Android原生SDK的软件包。通过这个,我可以访问Phunware SDK的所有方法和类。现在的挑战是,我必须遵循Phunware Android本机示例应用程序源代码,以Xamarin形式编写等效代码,并带来地图。我已经为示例提供了AndroidUIXML和活动文件 <?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.phunware.java.sample.LoadBuildingActivity">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:name="com.phunware.mapping.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignTop="@id/map"
android:background="@color/white"
android:orientation="vertical"
android:padding="6dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/switch_floors" />
<Spinner
android:id="@+id/floorSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
package com.landt.ismartphunware2;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.phunware.core.PwCoreSession;
//import com.phunware.java.sample.R;
import com.phunware.mapping.MapFragment;
import com.phunware.mapping.OnPhunwareMapReadyCallback;
import com.phunware.mapping.PhunwareMap;
import com.phunware.mapping.manager.Callback;
import com.phunware.mapping.manager.PhunwareMapManager;
import com.phunware.mapping.model.Building;
import com.phunware.mapping.model.FloorOptions;
public class LoadBuildingActivity extends AppCompatActivity implements OnPhunwareMapReadyCallback {
private static final String TAG = LoadBuildingActivity.class.getSimpleName();
private PhunwareMapManager mapManager;
private Building currentBuilding;
private ArrayAdapter<FloorOptions> spinnerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.load_building);
Spinner floorSpinner = findViewById(R.id.floorSpinner);
spinnerAdapter = new FloorAdapter(this);
floorSpinner.setAdapter(spinnerAdapter);
floorSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
FloorOptions floor = spinnerAdapter.getItem((int) id);
if (currentBuilding != null && floor != null) {
currentBuilding.selectFloor(floor.getLevel());
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// Create the map manager used to load the building
mapManager = PhunwareMapManager.create(this);
// Register the Phunware API keys
PwCoreSession.getInstance().registerKeys(this);
MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
if (mapFragment != null) {
mapFragment.getPhunwareMapAsync(this);
}
}
@Override
public void onPhunwareMapReady(final PhunwareMap phunwareMap) {
// Retrieve buildingId from integers.xml
int buildingId = getResources().getInteger(R.integer.buildingId);
mapManager.setPhunwareMap(phunwareMap);
mapManager.addBuilding(buildingId,
new Callback<Building>() {
@Override
public void onSuccess(Building building) {
Log.d(TAG, "Building loaded successfully");
currentBuilding = building;
// Populate floor spinner
spinnerAdapter.clear();
spinnerAdapter.addAll(building.getBuildingOptions().getFloors());
// Set building to initial floor value
FloorOptions initialFloor = building.initialFloor();
building.selectFloor(initialFloor.getLevel());
// Animate the camera to the building at an appropriate zoom level
CameraUpdate cameraUpdate = CameraUpdateFactory
.newLatLngBounds(initialFloor.getBounds(), 4);
phunwareMap.getGoogleMap().animateCamera(cameraUpdate);
}
@Override
public void onFailure(Throwable throwable) {
Log.d(TAG, "Error when loading building -- " + throwable.getMessage());
}
});
}
}
包com.landt.ismartpunware2;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.util.Log;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.Spinner;
导入com.google.android.gms.maps.CameraUpdate;
导入com.google.android.gms.maps.CameraUpdateFactory;
导入com.phunware.core.PwCoreSession;
//导入com.phunware.java.sample.R;
导入com.phunware.mapping.MapFragment;
导入com.phunware.mapping.onphunwaremappreadycallback;
导入com.phunware.mapping.PhunwareMap;
导入com.phunware.mapping.manager.Callback;
导入com.phunware.mapping.manager.phunwaremappmanager;
导入com.phunware.mapping.model.Building;
导入com.phunware.mapping.model.FloorProptions;
公共类LoadBuildingActivity扩展了AppCompativeActivity在PhunWaremapReadyCallback上的实现{
私有静态最终字符串标记=LoadBuildingActivity.class.getSimpleName();
私人PhunwareManager mapManager;
私人楼宇;
专用阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、负荷建筑);
微调器floorSpinner=findViewById(R.id.floorSpinner);
spinnerAdapter=新地板翼(此);
floorSpinner.setAdapter(旋转适配器);
floorSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
FloorProptions floor=spinnerAdapter.getItem((int)id);
如果(currentBuilding!=null&&floor!=null){
currentBuilding.selectFloor(floor.getLevel());
}
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
//创建用于加载建筑的地图管理器
mapManager=PhunwareMapManager.create(这个);
//注册Phunware API密钥
PwCoreSession.getInstance().registerKeys(此);
MapFragment MapFragment=(MapFragment)getFragmentManager().findFragmentById(R.id.map);
if(mapFragment!=null){
getphunwaremapsync(this);
}
}
@凌驾
公共无效onPhunwareMapReady(最终PhunwareMap PhunwareMap){
//从integers.xml检索buildingId
int buildingId=getResources().getInteger(R.integer.buildingId);
setPhunwareMap(phunwareMap);
mapManager.addBuilding(buildingId,
新回调函数(){
@凌驾
成功时的公共空间(建筑物){
Log.d(标记“建筑物加载成功”);
当前建筑物=建筑物;
//填充地板微调器
spinnerAdapter.clear();
spinnerAdapter.addAll(building.getBuildingOptions().getFloors());
//将建筑设置为初始楼层值
楼层比例initialFloor=building.initialFloor();
building.selectFloor(initialFloor.getLevel());
//以适当的缩放级别为建筑设置摄影机动画
CameraUpdate CameraUpdate=CameraUpdateFactory
.newLatLngBounds(initialFloor.getBounds(),4);
phunwareMap.getGoogleMap().animateCamera(cameraUpdate);
}
@凌驾
失败时的公共无效(可丢弃){
Log.d(标记“加载建筑时出错--”+throwable.getMessage());
}
});
}
}
在这里,他们将UI控件强制转换为MapFragment并调用getPhunwareMapAsync()方法。我只是想知道在Xamarin表单中,我们可以映射到这个MapFragment的控件是什么?如果我们即将在Xamarin Android项目的MainActivity中编写等效代码,我们如何在PCL项目和Android项目之间建立连接并查看地图?我只是想弄清楚如何开始,把什么放在哪里,因为我在Xamarin表单方面经验丰富,但在Android Native方面经验较少。Suggetion 1:
您可以尝试使用:
Xamarin.Forms.Maps提供了一个跨平台的抽象,用于显示在每个平台上使用本机地图API的地图,为用户提供快速熟悉的地图体验
-
- 关于Xamarin.Forms.Map的基本用法
- 地图功能可以通过创建地图来进一步增强
-
- 本文介绍如何为Map控件创建自定义渲染器,该渲染器在每个平台上显示具有自定义pin的本机地图和pin数据的自定义视图
ContentPage