Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以与Android本机控件等效的Xamarin形式呈现UI控件?_Android_Xamarin.forms_Binding - Fatal编程技术网

如何以与Android本机控件等效的Xamarin形式呈现UI控件?

如何以与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"?>

我计划将Phunware地图集成到Xamarin表单应用程序中。我能够创建Android绑定项目,这样我就可以得到相当于Phunware Android原生SDK的软件包。通过这个,我可以访问Phunware SDK的所有方法和类。现在的挑战是,我必须遵循Phunware Android本机示例应用程序源代码,以Xamarin形式编写等效代码,并带来地图。我已经为示例提供了AndroidUIXML和活动文件

 <?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数据的自定义视图
建议2: 自定义
ContentPage