【发布时间】:2017-10-10 07:23:12
【问题描述】:
在一个页面中,我有一个 ScrollView 和一些标签,中间有一个 Google Maps。在 Android 中,当我尝试向上或向下移动地图时,除了地图之外的所有页面都会移动。要显示我正在使用的地图Xamarin.Forms.GoogleMaps。我创建了自己的custommap 来绘制路线。该组件运行良好,我可以在iOS 和Android 中看到地图并且可以移动地图。
我在 Stackoverflow 和 this post 上阅读了一些帖子,但这些人总是 Activity 并且项目是原生的。
我创造了:
TouchableMapFragment
public class TouchableMapFragment : MapFragment
{
public event EventHandler TouchDown;
public event EventHandler TouchUp;
public override View OnCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState)
{
var root = base.OnCreateView(inflater, container, savedInstanceState);
var wrapper = new TouchableWrapper(Activity);
wrapper.SetBackgroundColor(Resources.GetColor(Android.Resource.Color.Transparent));
((ViewGroup) root).AddView(wrapper,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent,
ViewGroup.LayoutParams.MatchParent));
wrapper.TouchUp = () =>
{
if (TouchUp != null)
TouchUp(this, EventArgs.Empty);
};
wrapper.TouchDown = () =>
{
if (TouchDown != null)
TouchDown(this, EventArgs.Empty);
};
return root;
}
class TouchableWrapper : FrameLayout
{
public Action TouchDown;
public Action TouchUp;
#region ctors
protected TouchableWrapper(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer) {}
public TouchableWrapper(Context context)
: this(context, null) {}
public TouchableWrapper(Context context, IAttributeSet attrs)
: this(context, attrs, 0) {}
public TouchableWrapper(Context context, IAttributeSet attrs, int defStyle)
: base(context, attrs, defStyle) { }
#endregion
public override bool DispatchTouchEvent(MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
if (TouchDown != null)
TouchDown();
break;
case MotionEventActions.Cancel:
case MotionEventActions.Up:
if (TouchUp != null)
TouchUp();
break;
}
return base.DispatchTouchEvent(e);
}
}
}
view.xaml
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scroll">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<fragment
android:id="@+id/map"
android:layout_width="600dp"
android:layout_height="match_parent"
android:name="my.awesome.namespace.TouchableMapFragment" />
</LinearLayout>
</HorizontalScrollView>
Activity.cs
public class MyActivity : Activity
{
private GoogleMap _map;
private HorizontalScrollView _hsv;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.rtc);
_hsv = FindViewById<HorizontalScrollView>(Resource.Id.scroll);
SetupMapIfNeeded();
}
private void SetupMapIfNeeded()
{
if (null != _map) return;
var frag = FragmentManager.FindFragmentById<TouchableMapFragment>(Resource.Id.map);
if (frag != null)
{
frag.TouchUp += (sender, args) => _hsv.RequestDisallowInterceptTouchEvent(false);
frag.TouchDown += (sender, args) => _hsv.RequestDisallowInterceptTouchEvent(true);
_map = frag.Map;
if (_map == null) return; // will probably not happen
// do stuff to _map here, such as adding overlays etc.
}
}
}
有几个错误:
- 如何解决 Android 无法正确移动地图的问题?
- SetContentView(Resource.Layout.rtc);什么是 rtc?
- Resource.Id.map 不存在
就我而言,我有一个适用于 iOS 和 Android 项目的 PCL 解决方案。在 iOS 中一切都很好。唯一的问题是Android。我该如何解决这个问题?
有什么建议吗?谢谢。
【问题讨论】:
-
很难分辨什么是“rtc”,但基本上Resource.Layout.xxxx xxxx“是布局文件的名称,即xxxx.xml和layout.xml里面的任何组件都可以有一个“id”属性,例如,如果我们有一个 那么按钮的 id 是“something”,我们可以通过调用 Button btn = (Button ) Resource.id.something;
-
谢谢@GaneshCauda 我明白了。我的问题与我找到的代码有关。我无法理解如何在
Xamarin.Forms中使用它 -
查看您的代码,最好的可能是将“rtc”更改为“view”,反之亦然(“view.axml”更改为“rtc.axml”
-
尝试用 rtc.axml 改变 view.axml
-
试过了。没有改变。我的项目中没有
Activity,因为所有内容都在PCL项目中,带有ViewModels和Views。在这种情况下,MyActivity : Activity是什么?
标签: android google-maps xamarin xamarin.forms